业务处理-用户登录(让界面和业务层分离)
层与层之间耦合性降低,工厂类,代码解耦
步骤: ①在工程目录下建立一个source folder,config ②在里面建立一个config.properties文件,里面配置着 接口类 = 具体的实现类的完整包名路径类 UserService = cn.zengfansheng.lottery.engine.impl.UserServiceImpl ③UserService为接口类,里面提供暴露给外面调用的方法,用户登录方法login() UserServiceImpl为具体的实现类,实现UserService接口类 ④写一个工厂类,利用反射,用来获取具体的实现类 |
核心代码: ①配置文件config.properties(通过该配置文件,找到某一个具体接口的实现类,让上层调用者只需要调用接口中方法,从而实现调用的是实现类的方法,让层与层之间的耦合性降低了) #接口类=具体的完整实现类的路径
UserService=cn.zengfansheng.lottery.engine.impl.UserServiceImpler②接口类:UserService.java package cn.zengfansheng.lottery.engine;
import cn.zengfansheng.lottery.domain.User;
import cn.zengfansheng.lottery.net.protocol.Message;
public interface UserService {
/**
* 用户登录
* @param user 用户信息bean
* @return 用户登录服务器返回给用户的信息Message
*/
public abstract Message login(User user);
} ③具体的实现类:UserServiceImpl.javapackage cn.zengfansheng.lottery.engine.impl;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import android.util.Xml;
import cn.zengfansheng.lottery.ConstantValue;
import cn.zengfansheng.lottery.domain.User;
import cn.zengfansheng.lottery.engine.BasicService;
import cn.zengfansheng.lottery.engine.UserService;
import cn.zengfansheng.lottery.net.protocol.HttpClientAdapter;
import cn.zengfansheng.lottery.net.protocol.Message;
import cn.zengfansheng.lottery.net.protocol.element.UserLoginElement;
import cn.zengfansheng.lottery.util.DES;
/**
* 用户有关的业务服务
* @author hacket
*/
public class UserServiceImpl extends BasicService implements UserService {
/**
* 用户登录
* @param user 用户的信息bean
* @return 返回服务器给手机端的Message
*/
public Message login(User user) {
// TODO : 1、生成用户登陆请求(UserLoginElement)
UserLoginElement userLoginElement = new UserLoginElement();
userLoginElement.getActpassword().setTagValue(user.getPassword());
// TODO : 2、3、4、5、6
Message result = getResult(user, userLoginElement);
// 7、解析body(第二次解析) oelement:errorcode、errormsg
XmlPullParser parser = Xml.newPullParser();
Message resultMsg = new Message();
try {
parser.setInput(new StringReader(result.getBody().getEncodeBodyInfo()));//完全的未desc加密的body内容
int eventType = parser.getEventType();
while (XmlPullParser.END_DOCUMENT != eventType) {
String name = "";
switch (eventType) {
case XmlPullParser.START_TAG:
name = parser.getName();
if ("errorcode".equalsIgnoreCase(name)) {// 错误代码
int errorcode = Integer.parseInt(parser.nextText());
resultMsg.getBody().getOlement().setErrorcode(errorcode );
} else if ("errormsg".equalsIgnoreCase(name)) {// 具体错误信息
String errormsg = parser.nextText();
resultMsg.getBody().getOlement().setErrormsg(errormsg );
}
break;
case XmlPullParser.END_TAG:
break;
}
eventType = parser.next();
}
return result;
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
} } ④工厂类:ServiceFactory.java package cn.zengfansheng.lottery.factory;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* 业务服务的工厂类
* @author hacket
*/
public class ServiceFactory {
// 1、加载config.properties配置
private static Properties properties;
static{
//加载到内存中
properties = new Properties();
InputStream in = ServiceFactory.class.getClassLoader().getResourceAsStream("config.properties");
try {
properties.load(in);
} catch (IOException e) {
e.printStackTrace();
}
}
// 2、利用反射动态的获取具体的实现类
public static <T> T getServiceImplInstance(Class<T> clazz) { // 1、获取传递进来的接口类的简单名
String name = clazz.getName();
System.out.println("name=" + name);
// name=cn.zengfansheng.lottery.engine.UserService String simpleName = clazz.getSimpleName();
System.out.println("simpleName=" + simpleName);
// simpleName=UserService // 2、获取该接口对应的具体实现类的完整类名
String className = properties.getProperty(simpleName);
System.out.println("className=" + className); // 3、利用反射得到该完整类名对应的类
try {
@SuppressWarnings("unchecked")
T t = (T) Class.forName(className).newInstance();
return t;
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
} |
|