[lottery] 04_业务处理-用户登录(让界面和业务层分离)

Android 4.0

业务处理-用户登录(让界面和业务层分离)
层与层之间耦合性降低,工厂类,代码解耦

步骤:
①在工程目录下建立一个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.java
package 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;
    }
}