• 大话设计模式——4.装饰模式(Decorator Pattern)


    1.定义

    1)可以在不改动原有对象代码的情况下扩展对象的功能,通过聚合的方式相较于继承更加灵活。
    2)UML图

    2.示例

    汽车有很多装饰可选,如座椅、音响、轮胎等都可以进行自定义组装
    1)抽象汽车对象

    public interface Vehicle {
    
        /**
         * 产品名称
         */
        String productName();
    
        /**
         * 价格
         *
         * @return
         */
        double price();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    2)具体汽车对象

    public class BMWVehicle implements Vehicle {
    
    
        private final String vehicleName = "宝马X7";
    
        @Override
        public String productName() {
            return vehicleName;
        }
    
        @Override
        public double price() {
            return Math.pow(10, 6);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    3)汽车装饰对象

    public class VehicleDecorator implements Vehicle {
    
        // 聚合
        private Vehicle vehicle;
    
        public VehicleDecorator(Vehicle vehicle) {
            this.vehicle = vehicle;
        }
    
        @Override
        public String productName() {
            return vehicle.productName();
        }
    
        @Override
        public double price() {
            return vehicle.price();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    4)座椅装饰对象

    public class SeatDecorator extends VehicleDecorator {
    
        public SeatDecorator(Vehicle vehicle) {
            super(vehicle);
        }
    
        @Override
        public String productName() {
            return super.productName() + "+" + "真皮座椅*4";
        }
    
        @Override
        public double price() {
            return super.price() + Math.pow(10, 5);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    5)音响装饰对象

    public class SoundDecorator extends VehicleDecorator {
    
        public SoundDecorator(Vehicle vehicle) {
            super(vehicle);
        }
    
    
        @Override
        public String productName() {
            return super.productName() + "+" + "雅马哈音响*4";
        }
    
        @Override
        public double price() {
            return super.price() + Math.pow(10, 4);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    运行结果
    public class Main {
    
        public static void main(String[] args) {
            Vehicle myCar = new BMWVehicle();
            // 音响装饰
            myCar = new SoundDecorator(myCar);
            // 座椅装饰
            myCar = new SeatDecorator(myCar);
    
            System.out.println("配置:" + myCar.productName());
            System.out.println("价格:" + myCar.price());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    3.应用场景

    JDK中的IO流设计中就使用到了该模式。

    // 配置缓冲流
    InputStream  in = new BufferedInputStream(new FileInputStream(""););
    
    • 1
    • 2

    InputStream:抽象组件类
    在这里插入图片描述

    FileInputStream:被装饰类
    在这里插入图片描述
    FilterInputStream:装饰抽象类
    在这里插入图片描述
    BufferedInputStream:具体装饰类型
    在这里插入图片描述

    4.总结

    1)优点

    • 扩展功能不必修改原有代码,符合开闭原则
    • 较继承方式更为灵活

    2)缺点

    • 会构建较多子类,代码编写变的复杂,增加了系统的复杂度与运维理解难度
  • 相关阅读:
    Python的flask网页编程的GET和POST方法的区别
    js遮盖层下面不能滑动
    【NodeJs-5天学习】第二天篇④ ——项目模块化
    Linux学习-71-GRUB手动安装方法
    [go学习笔记.第十章.面向对象编程] 10.面向对象的特性-接口
    【C语言】通讯录《静态内存版本》
    request模块中,常见的状态码返回含义
    Docker 安装 nginx mysql redis minio leanote springboot云原生
    Flask 学习-61.Flask-Mail 发送邮件
    MM32F0020 UART1中断接收和UART1中断发送
  • 原文地址:https://blog.csdn.net/a1498665771/article/details/136372702