Java架构师升级之路之设计模式(装饰器模式< Decorator/wrapper>)

574 篇文章 4 订阅

举个小例子:

//虽然DataInput功能强大,但是它同样是 InputStream
//满足 is a关系 。为了某个实现类在不修改原有类的基础上动态地覆盖或者增加方法。  适配器最重要是兼容。
//该实现类与原有类的层级关系,是一种特殊的适配器模式。
InputStream  in=null;
FileInputStream fis=new DataInputStream(in);

在这里插入图片描述
在这里插入图片描述

代码:

decorator-old

package com.gupaoedu.decorator.old;

/**
 * ClassName:ResultMsg
 * PackageName:com.gupaoedu.adapter
 * Description:
 *
 * @date:2020/7/20 21:14
 * @author:robin
 */
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;
    }

    @Override
    public String toString() {
        return "ResultMsg{" +
                "code='" + code + '\'' +
                ", msg='" + msg + '\'' +
                ", data=" + data +
                '}';
    }
}

package com.gupaoedu.decorator.old;

/**
 * ClassName:Member
 * PackageName:com.gupaoedu.adapter
 * Description:
 *登录类
 * @date:2020/7/20 21:26
 * @author:robin
 */
public class Member {
    private  String username;
    private  String password;
    private  String mid;

    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;
    }

    private  String info;
}

package com.gupaoedu.decorator.old;

import com.gupaoedu.adapter.Member;
import com.gupaoedu.adapter.ResultMsg;

/**
 * ClassName:SignServiceImpl
 * PackageName:com.gupaoedu.decorator.old
 * Description:
 *
 * @date:2020/7/23 14:15
 * @author:robin
 */
public class SignServiceImpl implements  IsigninService {
    //注册方法
    public ResultMsg regist(String username,String password){
        return  new ResultMsg("200","注册成功",new com.gupaoedu.adapter.Member());
    }
    //登录方法
    public  ResultMsg login(String username,String password){
        return  new ResultMsg("200","登录成功",new Member());
    }
}

package com.gupaoedu.decorator.old;

import com.gupaoedu.adapter.Member;
import com.gupaoedu.adapter.ResultMsg;

/**
 * ClassName:IsigninService
 * PackageName:com.gupaoedu.decorator.old
 * Description:
 *
 * @date:2020/7/23 14:14
 * @author:13812536906
 */
public interface IsigninService {
    //注册方法
    public ResultMsg regist(String username, String password);
    //登录方法
    public  ResultMsg login(String username, String password);
}

package com.gupaoedu.decorator.upgrade;

import com.gupaoedu.adapter.ResultMsg;
import com.gupaoedu.decorator.old.IsigninService;

/**
 * ClassName:IsigninForThirdService
 * PackageName:com.gupaoedu.decorator.upgrade
 * Description:
 *
 * @date:2020/7/23 14:19
 * @author:robin
 */
public interface IsigninForThirdService  extends IsigninService {
    public ResultMsg loginForQQ(String openid);
    public  ResultMsg loginForWechat(String openid);
    public  ResultMsg loginForToken(String token);
    public  ResultMsg loginForTelphone(String telphone,String code);
    public  ResultMsg loginForRegist(String username,String password);
}

package com.gupaoedu.decorator.upgrade;

import com.gupaoedu.adapter.ResultMsg;
import com.gupaoedu.decorator.old.IsigninService;

/**
 * ClassName:IsigninForThirdServiceImpl
 * PackageName:com.gupaoedu.decorator.upgrade
 * Description:
 *  IsigninForThirdService 是新接口
 * @date:2020/7/23 14:21
 * @author:robin
 */
public class IsigninForThirdServiceImpl implements IsigninForThirdService {
   private  IsigninService isigninService;
    public IsigninForThirdServiceImpl(IsigninService service){
               this.isigninService=service;
    }
    @Override
    public ResultMsg regist(String username, String password) {

        return isigninService.regist(username,password);
    }

    @Override
    public ResultMsg login(String username, String password) {

        return isigninService.login(username,password);
    }
    public  ResultMsg loginForQQ(String openid){
        //适配器无缝对接
        //1.认为openid全局唯一,我们可以把它当做用户名
        //2.密码默认为 null; 或者为QQ_EMPTY
        //3.注册:在原有系统里创建一个用户
        ResultMsg msg = this.regist(openid, null);

        //4.调用原来的登录方法。
        msg = this.login(openid, null);

        return  msg;
    }
    public  ResultMsg loginForWechat(String openid){
        return  null;
    }
    public  ResultMsg loginForToken(String token){
        return  null;
    }
    public  ResultMsg loginForTelphone(String telphone,String code){
        return  null;
    }
    public  ResultMsg loginForRegist(String username,String password){
        return  null;
    }

}

package com.gupaoedu.decorator;

import com.gupaoedu.adapter.SigninForThirdService;
import com.gupaoedu.decorator.old.SignServiceImpl;
import com.gupaoedu.decorator.upgrade.IsigninForThirdService;
import com.gupaoedu.decorator.upgrade.IsigninForThirdServiceImpl;

/**
 * ClassName:SignInTest
 * PackageName:com.gupaoedu.decorator
 * Description:
 *
 * @date:2020/7/23 14:35
 * @author:robin
 */
public class SignInTest {
    public static void main(String[] args) {
        /**
         * 这样用好处:  保留了原来的方法和逻辑,而且两个需求使用的话并不影响的。
         * 对它进行了升级与优化
         */
        IsigninForThirdService isigninForThirdService=new IsigninForThirdServiceImpl(new SignServiceImpl());
        /**
         * 表现形式的区别:
         * 适配器模式,换句话说,原来的功能可以不用了,可以丢弃了。
         * 装饰器模式:原来的功能依旧对外开放,依旧保留;新的功能同样也可以用
         *  装饰者模式变相多继承。(属于结构型模式,使用的是面向对象的思想设计)
         */
        isigninForThirdService.loginForQQ("iiiiiiiiidd123");
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值