• 深度学习设计模式之装饰器模式



    前言

    装饰器模式属于结构型模式,又叫包装设计模式,动态的将责任添加到对象上。


    一、介绍

    装饰器模式又叫包装设计模式,为现有的类的一个包装,允许向一个现有的对象添加新的功能,同时又不改变其结构。给对象增加功能,一般两种方式 继承或关联组合,将一个类的对象嵌入另一个对象中,由另一个对象来决定是否调用嵌入对象的行为来增强功能,这个就是装饰器模式,比继承更加灵活。

    二、详细分析

    1.核心组成

    • 抽象组件(Component):定义装饰⽅方法的规范;
    • 被装饰者(ConcreteComponent):Component的具体实现,也就是我们要装饰的具体对象;
    • 装饰者组件(Decorator):定义具体装饰者的行为规范, 和Component角色有相同的接口,持有组件(Component)对象的实例例引用;
    • 具体装饰物(ConcreteDecorator):负责给构件对象装饰附加的功能。

    在这里插入图片描述

    2.实现步骤

    1. 创建抽象组件,定义公用的方法;
    2. 创建被抽象者,实现抽象组件接口,实现基础方法;
    3. 创建装饰者,实现抽象组件接口,可不做实现;
    4. 创建具体抽象者,继承装饰者类,实现具体方法,添加抽象组件属性。

    3.代码示例

    抽象组件

    /**
     * 抽象组件
     */
    public interface Computer {
    
        /**
         * 描述
         */
        String getDesc();
    
        /**
         * 价格
         * @return
         */
        int getPrice();
    
    }
    

    被装饰者

    /**
     * 被装饰者
     */
    public class DesktopComputer implements Computer {
    
        private String desc = "台式机";
    
        @Override
        public String getDesc() {
            return desc;
        }
    
        @Override
        public int getPrice() {
            return 5000;
        }
    }
    
    /**
     * 被装饰者
     */
    public class LaptopComputer implements Computer {
    
        private String desc = "笔记本电脑";
        @Override
        public String getDesc() {
            return desc;
        }
    
        @Override
        public int getPrice() {
            return 6000;
        }
    }
    
    

    装饰者

    /**
     * 装饰者
     */
    public class ComputerDecorator implements Computer {
    
        private String desc = "";
    
        @Override
        public String getDesc() {
            return desc;
        }
    
        @Override
        public int getPrice() {
            return 0;
        }
    }
    
    

    具体装饰物

    /**
     * 具体装饰者
     */
    public class RAMComputerDecorator extends ComputerDecorator{
    
        private Computer computer;
    
        public RAMComputerDecorator(Computer computer) {
            this.computer = computer;
        }
    
        private String desc = "增加16G内存";
    
        @Override
        public String getDesc() {
            return computer.getDesc()+","+desc;
        }
    
        @Override
        public int getPrice() {
            return computer.getPrice() + 500;
        }
    }
    
    /**
     * 具体装饰物
     */
    public class SSDComputerDecorator extends ComputerDecorator{
    
        private Computer computer;
    
        private String desc = "增加1T的固态硬盘";
    
        public SSDComputerDecorator(Computer computer) {
            this.computer = computer;
        }
    
        @Override
        public String getDesc() {
            return computer.getDesc()+","+desc;
        }
    
        @Override
        public int getPrice() {
            return computer.getPrice()+1000;
        }
    }
    

    测试类

     public static void main(String[] args) {
            Computer computer = new DesktopComputer();
            // 增加硬盘
            computer = new SSDComputerDecorator(computer);
            // 增加内存
            computer = new RAMComputerDecorator(computer);
    
            System.out.println(computer.getDesc()+",价格为:"+computer.getPrice());
    
        }
    

    结果:
    在这里插入图片描述

    4.优缺点

    优点

    • 可以在运行时动态地给一个对象添加额外的职责。
    • 装饰类会继承原始类的所有接口和实现,因此对于客户端来说,装饰对象和原始对象可以无缝替换。
    • 当需要修改现有功能或添加新功能时,可以通过添加新的装饰类来实现,而不需要修改原有的代码。

    缺点

    • 每增加一个装饰器,系统中就多了一个类,这可能会使系统变得更加复杂。
    • 随着装饰器数量的增加,管理这些装饰器可能会变得困难。

    5.使用场景

    • 当需要动态地给对象添加额外功能时,装饰器模式可以在运行时通过组合的方式来增强对象的功能,而不需要通过继承来静态扩展。
    • 当通过继承来扩展功能导致类的数量急剧增加,形成复杂的继承体系时,装饰器模式可以作为一种替代方案来简化设计。

    总结

    以上就是今天要讲的内容,本文简单介绍了装饰器模式的优缺点和使用场景,提供了代码示例。装饰器模式也在Java IO类中的输入输出流中被广泛使用,大家有兴趣可以再看下相关资料代码。

  • 相关阅读:
    TorchDrug--药物属性预测
    技术分享 | Jenkins 多任务关联
    kubernetes kube-apiserver 存在SSRF漏洞
    取数游戏2(动态规划java)
    贪心算法-会议室问题
    java毕业设计网站SSM幼儿园信息管理系统
    Vue 怎么调用ElementUI中的方法?
    【二】【SQL】去重表数据及分组聚合查询
    C#线索二叉树的定义
    HTTP协议3)----对于网络层的详细讲解
  • 原文地址:https://blog.csdn.net/G_whang/article/details/139308953