设计模式之装饰器模式
装饰者模式(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);
}