• 徒手撸设计模式-装饰器模式


    概念

    装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

    这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

    我们通过下面的实例来演示装饰器模式的用法。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。

    参考链接: https://www.runoob.com/design-pattern/decorator-pattern.html

    代码案例

    新增车子接口

    复制代码
    /**
     * 生产车子接口
     */
    public interface Cars {
        String product();
    }
    复制代码

     

    三个实现类

    自行车

    复制代码
    /**
     * 生产自行车
     */
    @Slf4j
    public class   Bicycle implements Cars {
        @Override
        public String product() {
            log.info("生产自行车");
            return "自行车";
        }
    }
    复制代码

     

    汽车

    复制代码
    /**
     * 生产汽车
     */
    @Slf4j
    public class Car implements Cars {
        @Override
        public String product() {
            log.info("生产汽车");
            return "汽车";
        }
    }
    复制代码

     

    车子装饰器

    复制代码
    /**
     * 车子装饰类
     */
    @Slf4j
    public abstract class CarsDecorator implements Cars {
        protected Cars decoratorCars;
    
        public CarsDecorator(Cars decoratorCars) {
            this.decoratorCars = decoratorCars;
        }
    
        @Override
        public String product() {
            return decoratorCars.product();
        }
    }
    复制代码

     

    颜色装饰器

    复制代码
    /**
     * 土豪金色车子装饰器
     */
    public class GoldenCarsDecorator extends CarsDecorator {
        public GoldenCarsDecorator(Cars decoratorCars) {
            super(decoratorCars);
        }
    
        @Override
        public String product() {
            String product = decoratorCars.product();
            return setColour(decoratorCars)+"----"+product;
        }
    
        public String setColour(Cars decoratorCars){
            decoratorCars.product();
            return "土豪金色";
        }
    }
    复制代码

     

    测试主类

    复制代码
    /**
     * 设计模式控制器
     */
    @RestController
    @RequestMapping("/designPattern")
    @Slf4j
    public class DesignController {
    
        @GetMapping("/decorator")
        public ResponseModel decorator() {
            com.koukay.student.design.decorator.Cars bicycle= new com.koukay.student.design.decorator.impl.Bicycle();
            CarsDecorator cdCar = new GoldenCarsDecorator(new com.koukay.student.design.decorator.impl.Car());
            CarsDecorator cdBicycle = new GoldenCarsDecorator(new com.koukay.student.design.decorator.impl.Bicycle());
            com.koukay.student.design.decorator.Cars cdCarCars = new GoldenCarsDecorator(new com.koukay.student.design.decorator.impl.Car());
            com.koukay.student.design.decorator.Cars cdBicycleCars = new GoldenCarsDecorator(new com.koukay.student.design.decorator.impl.Bicycle());
            String bicyclePS = bicycle.product();
            String CarD = cdCar.product();
            String bicycleD = cdBicycle.product();
            String carP = cdCarCars.product();
            String bicycleP = cdBicycleCars.product();
            LinkedHashMap map= new LinkedHashMap();
            map.put("bicyclePS",bicyclePS);
            map.put("CarD",CarD);
            map.put("bicycleD",bicycleD);
            map.put("carP",carP);
            map.put("bicycleP",bicycleP);
            return new ResponseModel("装饰器模式完成", 200, map);
        }
    }
    复制代码

     

    测试案例

     

     

    复制代码
    2022-06-25 01:05:47.315 INFO  生产自行车 【http-nio-8081-exec-7】【Bicycle:132022-06-25 01:05:47.316 INFO  生产汽车 【http-nio-8081-exec-7】【Car:132022-06-25 01:05:47.317 INFO  生产汽车 【http-nio-8081-exec-7】【Car:132022-06-25 01:05:47.326 INFO  生产自行车 【http-nio-8081-exec-7】【Bicycle:132022-06-25 01:05:47.328 INFO  生产自行车 【http-nio-8081-exec-7】【Bicycle:132022-06-25 01:05:47.328 INFO  生产汽车 【http-nio-8081-exec-7】【Car:132022-06-25 01:05:47.328 INFO  生产汽车 【http-nio-8081-exec-7】【Car:132022-06-25 01:05:47.329 INFO  生产自行车 【http-nio-8081-exec-7】【Bicycle:132022-06-25 01:05:47.329 INFO  生产自行车 【http-nio-8081-exec-7】【Bicycle:13】
    复制代码

     

  • 相关阅读:
    什么是业务流程图(TFD),数据字典(DD),数据流程图(DFD)
    基于 RocksDB 实现高可靠、低时延的 MQTT 数据持久化
    高端程序员上班摸鱼指南
    1-10嵌入式Linux系统开发与应用|嵌入式Linux|第三章 Linux编程环境
    Dotnet工具箱:开源、免费的纯前端工具网站,带你探索10大工具分类和73个实时在线小工具
    Maven的第一天
    【题目集2】链表经典题目
    【MATLAB】字体美化和乱码
    【NSFileManager的其他常用方法 创建文件等 Objective-C语言】
    3D打印喷嘴大小如何选择0.2-0.5mm喷嘴
  • 原文地址:https://www.cnblogs.com/hikoukay/p/16410620.html