• 大话设计模式——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)缺点

    • 会构建较多子类,代码编写变的复杂,增加了系统的复杂度与运维理解难度
  • 相关阅读:
    一场深刻的开源聚会:KCC@北京 9.2 活动回顾
    ffmpeg截取视频
    mysql
    MySQL-1(12000字详解)
    我的NVIDIA开发者之旅——为 NVIDIA Jetson Nano 运行 Docker 容器(学习笔记)
    【Java】DTO、PO、VO 类相互转换的工具
    编程语言参数传递方式和变量的两种基本类型
    用人工智能预测彩票,利用大数据预测彩票
    Qt+树莓派4B 窗口半透明效果实现
    基于SSM实现高校应届生就业管理系统
  • 原文地址:https://blog.csdn.net/a1498665771/article/details/136372702