设计模式之装饰器模式

设计模式之装饰器模式

装饰者模式(Decorator Pattern)是指在不改变原有对象的 基础之上,将功能附加到对象上,提供了比继承更有弹性的替
代方案(扩展原有对象的功能)。 属于结构型模式。

使用场景
1、用于扩展一个类的功能或给一个类添加附加职责。
2、动态的给一个对象添加功能,这些功能可以再动态的撤销

优点:
1、装饰者是继承的有力补充,比继承灵活,不改变原有对象 的情况下动态地给一个对象扩展功能,即插即用。
2、通过使用不同装饰类以及这些装饰类的排列组合,可以实 现不同效果。
3、装饰者完全遵守开闭原则
缺点:
1、会出现更多的代码,更多的类,增加程序复杂性。
2、动态装饰时,多层装饰时会更复杂

需求:现在在登录过程中会出现一下情况:
①未绑定手机号,需弹窗绑定
②密码已过期需弹窗修改
以上两种情况可能出现任一种或两种同时,由此组成一个进度条。

先看类图:
在这里插入图片描述

1.写一个抽象父接口
public interface LoginStepService {
    List<LoginStepsDTO> buildSteps();
}
2.基础进度条(即这里的空集合)
public class BaseLoginStep implements LoginStepService{
    @Override
    public List<LoginStepsDTO> buildSteps(){
        List<LoginStepsDTO> list = new ArrayList<>();
        return list;
    }
}
3.装饰器
public abstract class LoginStepDecorator implements LoginStepService{

    private LoginStepService loginStepService;

    public LoginStepDecorator(LoginStepService loginStepService) {
        this.loginStepService = loginStepService;
    }
    @Override
    public List<LoginStepsDTO> buildSteps() {
    	//调用父接口的方法,哪个子类的实现调的就进入哪个实现类的方法
        return loginStepService.buildSteps();
    }
}
4.两个业务类
public class BindMobileNoStep extends LoginStepDecorator{

    public BindMobileNoStep(LoginStepService loginStepService) {
        super(loginStepService);
    }
    @Override
    public List<LoginStepsDTO> buildSteps() {
    	//拿到父类的集合(即已经装进去的进度条数据)
        List<LoginStepsDTO> loginStepsList = super.buildSteps();
        //再往集合里装自己的数据
        LoginStepsDTO loginStepsDTO = LoginStepsDTO
                .builder()
                .title(LoginStepEnum.BIND_PHONE.getTitle())
                .code(LoginStepEnum.BIND_PHONE.getDesc())
                .build();
        loginStepsList.add(loginStepsDTO);
        return loginStepsList;
    }
}
public class UpdatePwdStep extends LoginStepDecorator  {

    public UpdatePwdStep(LoginStepService loginStepService) {
        super(loginStepService);
    }
    @Override
    public List<LoginStepsDTO> buildSteps() {
    //拿到父类的集合(即已经装进去的进度条数据)
        List<LoginStepsDTO> loginStepsList = super.buildSteps();
         //再往集合里装自己的数据
        LoginStepsDTO loginStepsDTO =  LoginStepsDTO
                .builder()
                .title(LoginStepEnum.UPDATE_PASSWORD.getTitle())
                .code(LoginStepEnum.UPDATE_PASSWORD.getDesc())
                .build();
        loginStepsList.add(loginStepsDTO);
        return loginStepsList;
    }
}
5. 业务中调用

/**

  • 这里仅用于示意
    **/
 @Override
    public void testSteps() {
        LoginStepService loginStepService;
        //创建基础集合
        loginStepService = new BaseLoginStep();
        //添加绑定手机号
        loginStepService = new BindMobileNoStep(loginStepService);
        //修改密码
        loginStepService =new UpdatePwdStep(loginStepService);

        List<LoginStepsDTO> list = loginStepService.buildSteps();

        System.out.println(list);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神雕大侠mu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值