美文网首页
Java 装饰者模式

Java 装饰者模式

作者: 索性流年 | 来源:发表于2021-02-18 09:21 被阅读0次

    什么是装饰者模式?

    • 在不改变原对象的基础上,附加新功能,相比生成子类更加灵活

    装饰者模式应用场景

    • 动态给一个对象添加或撤销功能

    优点

    • 可以在不改变对象的情况下动态的扩展功能,可以使扩展的多个功能按想要的顺序执行,以实现不同的效果。

    缺点

    • 扩展类变多,使程序更加复杂。

    装饰者模式定义

    • (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 "成功";
        }
    }
    
    
    
    
    

    相关文章

      网友评论

          本文标题:Java 装饰者模式

          本文链接:https://www.haomeiwen.com/subject/qfmaactx.html