什么是装饰者模式?
- 在不改变原对象的基础上,附加新功能,相比生成子类更加灵活
装饰者模式应用场景
- 动态给一个对象添加或撤销功能
优点
- 可以在不改变对象的情况下动态的扩展功能,可以使扩展的多个功能按想要的顺序执行,以实现不同的效果。
缺点
- 扩展类变多,使程序更加复杂。
装饰者模式定义
-
(1)抽象组件:定义一个抽象接口,来规范准备附加功能的类。
-
(2) 具体组件:将要被附加功能的类,实现抽象构件角色接口。
-
(3) 抽象装饰者:持有对具体构件角色的引用并定义与抽象构件角色一致的接口。
-
(4)具体装饰:实现抽象装饰者角色,负责对具体构件添加额外功能。
案例
- 用户告诉你造房子,一开始只有房顶、门、窗、四面墙,你告诉用户造好了,用户一看这不行啊,最起码的刮个大白,贴个地砖吧。这时候你总不能把房子拆了重新建一个带大白和地砖的房子吧,这样肯定是不合适的,只能说是在这个造好的房子上,刷上大白,贴上地砖,在告诉用户房子造好了。
公共抽象方法:造房子
抽象类实现:房顶、门、窗、四面墙
扩展抽象类:刮大白,贴地砖(由子类实现)
执行完成返回完整房子。
新建.class component抽象类
public abstract class CreateBuildingMethodApi {
/*定义公共行为造房子方法*/
public abstract void CreateTheBuildingMethod();
}
创建抽象类基本实现concreteComponent
/*造房子方法实现*/
public class CreateBuildingMethodImpl extends CreateBuildingMethodApi {
@Override
public void CreateTheBuildingMethod() {
System.err.println("第一步实现造房子");
}
}
创建扩展抽象类decorator
public class Decorator extends CreateBuildingMethodApi {
public CreateBuildingMethodApi methodApi;
public Decorator(CreateBuildingMethodApi methodApi) {
this.methodApi = methodApi;
}
@Override
public void CreateTheBuildingMethod() {
if (methodApi != null){
methodApi.CreateTheBuildingMethod();
}
}
}
创建扩展抽象类实现ConcreteDecorator
public class RenderingDecorator extends Decorator{
public RenderingDecorator(CreateBuildingMethodApi methodApi) {
super(methodApi);
}
@Override
public void CreateTheBuildingMethod() {
super.CreateTheBuildingMethod();
System.err.println("第二步粉刷");
}
}
public class FloorTileDecorator extends Decorator{
public FloorTileDecorator(CreateBuildingMethodApi methodApi) {
super(methodApi);
}
@Override
public void CreateTheBuildingMethod() {
super.CreateTheBuildingMethod();
System.err.println("第三步贴地砖");
}
}
创建Controller 测试
@RestController
public class TestController {
@Autowired
@GetMapping("/test")
public String test() {
//逆向创建对象
RenderingDecorator renderingDecorator = new RenderingDecorator(new FloorTileDecorator(new CreateBuildingMethodImpl()));
renderingDecorator.CreateTheBuildingMethod();
return "成功";
}
}
网友评论