JAVA设计模式-适配器模式(Adapter)

star2017 1年前 ⋅ 2118 阅读

适配器模式

当我们需要一个转换头的时候,可以考虑到适配器模式
现实生活中的适配器(兼容):
VGA-HDMI/充电头/插头转换/编码解码/调制解调器

系统应用场景:
老系统运行了很久比较稳定,为了保证其稳定性,不便再去修改原来的代码,但是又要为了兼容新的需求或者标准,我们不得不在系统中再去做一些文章。(向下兼容)

系统应用场景举例:
登录------
用户名、密码输入 后台验证用户名密码的有效性--> 登录结果保存到session中-->写入到浏览器cookie
随着互联网技术的发展,用户的需求的多样化
登录关联了新的方式:QQ登录,微信登录,手机号登录,微博登录等
原始系统代码很复杂,不想随意去修改原始系统,就可以使用到适配器模式

JAVA中的应用

以Adapter结尾的
file

HttpWebHandleAdapter

WebSocket

登录的适配器示例代码

返回类型的基础代码:

package com.debuggg.test1.main5;

public class ResultMsg {
    private String code;
    private String msg;
    private Object data;

    public ResultMsg(String code, String msg, Object data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}

用户信息:

package com.debuggg.test1.main5;

public class Mmeber {
    private String username;
    private String password;
    private String mid;
    private String info;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getMid() {
        return mid;
    }

    public void setMid(String mid) {
        this.mid = mid;
    }

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }
}

原始登录代码:

package com.debuggg.test1.main5;

import com.debuggg.test1.templatemethod.entity.Member;

public class SigninService {
    /**
     * 作者 ZYL
     * 功能描述 : 注册
     * 日期 2020-04-13 17:32  
     * 参数 username
     * 参数 password
     * 返回值 com.debuggg.test1.main5.ResultMsg
     */
    public ResultMsg regist(String username, String password){
        return new ResultMsg("200","注册成功",new Member());
    }

    /**
     * 作者 ZYL
     * 功能描述 : 登录
     * 日期 2020-04-13 17:32
     * 参数 username
     * 参数 password
     * 返回值 com.debuggg.test1.main5.ResultMsg
     */
    public ResultMsg login(String username, String password){
        return  null;
    }
}

适配器登录的代码:

package com.debuggg.test1.main5;

/**
 * 作者 ZYL
 * 功能描述 : 稳定的方法不去动,直接继承下来
 * 日期 2020-04-13 17:34
 * 参数 null
 * 返回值 
 */
public class SigninForThirdService extends SigninService {
    public ResultMsg loginForQQ(String openId){
        //1.认为openId是全局唯一,我们可以把它当做是用户名username
        //2.密码默认为null(空的),或者默认值"QQ_EMPTY"
        //3.注册(在原有系统创建一个用户)
        //4.调用原来的登录方法
        return loginForRegist(openId,null);
    }

    public ResultMsg loginForWechat(String openId){
        return null;
    }

    public ResultMsg loginForToken(String token){
        //通过token拿到用户信息,重新登录一次
        return null;
    }

    public ResultMsg loginForTelephone(String phone, String code){
        //把手机号设置为用户名,密码设置为空,来操作
        return null;
    }

    public ResultMsg loginForRegist(String username, String password){
        super.regist(username, password);
        return super.login(username,password);
    }
}

测试代码:

package com.debuggg.test1.main5;

/**
 * 作者 ZYL
 * 功能描述 : 适配器模式
 *
 * 需要一个转换头的时候,可以考虑到适配器模式
 * 现实生活中的适配器(兼容):
 *  VGA-HDMI/充电头/插头转换/编码解码/调制解调器
 *
 * 系统应用场景:
 *  老系统运行了很久比较稳定,为了保证其稳定性,不便再去修改原来的代码,但是又要为了兼容新的需求或者标准,我们不得不在系统中再去做一些文章。(向下兼容)
 *
 * 系统应用场景举例:
 *  登录------
 *  用户名、密码输入    后台验证用户名密码的有效性--> 登录结果保存到session中-->写入到浏览器cookie
 *  随着互联网技术的发展,用户的需求的多样化
 *  登录关联了新的方式:QQ登录,微信登录,手机号登录,微博登录等
 *  原始系统代码很复杂,不想随意去修改原始系统,就可以使用到适配器模式
 *
 * 日期 2020-04-13 17:23
 * 参数 null
 * 返回值
 */
public class AdapterTest {
    public static void main(String[] args) {
        SigninForThirdService service = new SigninForThirdService();
        //不改变原来的代码,也要实现新的登录
        //还可以再加一层策略模式
        service.loginForQQ("thisisopenidxxxxxxx");
    }
}
更多内容请访问:IT源点

相关文章推荐

全部评论: 0

    我有话说: