• 装饰者模式--设计模式


    今天我们继续讲解一下设计模式中的另一种---装饰器模式.

    一、定义及结构图

    装饰器模式是指对已经存在的某些类进行装饰,来扩展一些功能,属于结构型模式.创建一个装饰类来包装原有的类以达到装饰的效果.其结构图如下所示:

    • Component为统一的接口,也是被装饰类和装饰类的基本.
    • ConcreteComponent为具体实现类, 也是被装饰类,他本身是个具有一定功能的完整的类.
    • Decorator是装饰类,实现了Component接口的同时还维护了一个实例,并可以经过构造函数初始化。而Decorator本身,存在仅仅是一个生命
    • ConcreteDecorator是具体的装饰产品类,每一种装饰产品都具有特定的装饰效果。可以通过构造器声明装饰了哪种类型的ConcreteComponent,从而对其进行装饰。

    二、实例讲解

    我们以一个电脑配置的例子说明。

    首先创建一个电脑的接口,给出两个抽象方法,分别是获取电脑的名字和获取价格:

    /**
     * 抽象电脑类
     * 
     */
    public interface AbstractComputer {
        String name();
        double price();
    }

    创建一个普通电脑类实现上面的接口:

    /**
     * 普通电脑类
     * 
     */
    public class Computer implements AbstractComputer {
        @Override
        public String name() {
            return "普通电脑";
        }
    
        @Override
        public double price() {
            return 3000;
        }
    }

    现在有一个需求是需要给普通的电脑加一个内存和硬盘,即在现有的基础上对该电脑进行装饰。

    首先需要创建一个装饰类接口来确定加入的是哪一种配置,电脑配件依附于电脑和电脑有相同的属性。

    /**
     * 装饰类接口
     * 
     */
    public interface Device extends AbstractComputer {
        String name();
        double price();
    }

    分别创建装饰类的实现类来定义具体装饰内容:

    /**
     * 内存类
     * 
     */
    public class Memory implements Device {
        public AbstractComputer computer;
    
        public Memory(AbstractComputer computer) {
            this.computer = computer;
        }
    
        @Override
        public String name() {
            return computer.name()+"加内存";
        }
    
        @Override
        public double price() {
            return computer.price()+300;
        }
    }
    /**
     * 硬盘类
     * 
     */
    public class HardDisk implements Device {
        public AbstractComputer computer;
    
        public HardDisk(AbstractComputer computer) {
            this.computer = computer;
        }
        @Override
        public String name() {
            return computer.name()+"加硬盘";
        }
    
        @Override
        public double price() {
            return computer.price()+500;
        }
    }

    然后我们写一个demo来看下装饰效果如下:

    public class DecoratorPatternDemo {
    
        public static void main(String[] args) {
    
            //创建普通的电脑
            Computer computer = new Computer();
    
            //给普通电脑加硬盘
            HardDisk hardDisk = new HardDisk(computer);
            System.out.println(hardDisk.name());
            System.out.println(hardDisk.price());
    
            //给普通电脑加内存
            Memory memory = new Memory(computer);
            System.out.println(memory.name());
            System.out.println(memory.price());
    
            //给普通电脑加硬盘和内存
            Memory memory1 = new Memory(hardDisk);
            System.out.println(memory1.name());
            System.out.println(memory1.price());
    
        }
    
    }

    输出结果:

    普通电脑加硬盘
    3500.0
    普通电脑加内存
    3300.0
    普通电脑加硬盘加内存
    3800.0

    三、总结

    装饰器的价值就体现在“装饰”上,并不会改变原来对象的性质。当然以上功能也可以通过继承实现,但当一个对象出现一个功能就要创建出一个子类是很不合理的。装饰器模式动态添加功能,大大的提高了扩展性,也一定程度上降低了子类的数量,降低了耦合度。

    上面就是装饰器的基本内容,希望对大家理解装饰器模式有所帮助!!!

  • 相关阅读:
    SQL Server调优系列基础篇(常用运算符总结——三种物理连接方式剖析)
    SQL Server调优系列基础篇
    《SQL Server企业级平台管理实践》读书笔记——SQL Server中关于系统库Tempdb总结
    你所不知道的SQL Server数据库启动过程(用户数据库加载过程的疑难杂症)
    你所不知道的SQL Server数据库启动过程,以及启动不起来的各种问题的分析及解决技巧
    《SQL Server企业级平台管理实践》读书笔记——几个系统库的备份与恢复
    Struts2
    Struts2
    Struts2
    Struts2
  • 原文地址:https://www.cnblogs.com/guohai-stronger/p/11842867.html
Copyright © 2020-2023  润新知