• 设计模式-装饰者模式


    一、定义

     动态的给一个对象添加一些额外的职责。就增加功能来说,装饰者相比生成子类更灵活。

    角色:

    Component抽象构建:一个接口或抽象类,定义我们最核心的对象,也就是原始对象。

    ConcreateComponent具体构建:是Component的具体实现。

    Decorator装饰角色:一般是一个抽象类,实现或继承Component,这个类里面必然有一个private的Component属性。

    ConcreateDecorator具体装饰角色:装饰ConcreateComponent对象。

    二、类型

     结构型

    三、适用场景

    • 需要扩展一个类的功能,或给一个类增加附加功能。
    • 需要动态地给一个对象增加功能,这些功能可以动态的撤销。
    • 需要为一批的兄弟类加装功能。

    四、优点

    • 装饰者和被装饰者相互独立。
    • 装饰者模式是继承关系的一个替代方案。不管装饰多少层放回的还是Component,实现还是is-a的关系。
    • 可以动态的扩展一个实现类的功能。
    • 防止类爆炸,不采用装饰者模式,有多少个具体实现类就要继承多少次。

    五、缺点

     多层装饰增加了系统的复杂度。

    六、类图

     

    继承实现和装饰者实现类图对比:

    七、代码实现

     抽象构建:

    package com.wms.structural.decorator;
    
    public interface Animal {
        void  getName();
    }

     具体实现:

    package com.wms.structural.decorator;
    
    public class Cat implements Animal {
        public void getName() {
            System.out.println("小猫");
        }
    }
    package com.wms.structural.decorator;
    
    public class Pig implements Animal {
        public void getName() {
            System.out.println("小猪");
        }
    }

     装饰角色:

    package com.wms.structural.decorator;
    
    public class AnimalDecorator implements Animal {
    
        private Animal animal;
    
        public AnimalDecorator(Animal animal) {
            this.animal = animal;
        }
    
        public void getName() {
            this.animal.getName();
        }
    }

    具体的装饰类:

    package com.wms.structural.decorator;
    
    public class YellowAnimalDecotator extends AnimalDecorator {
        public YellowAnimalDecotator(Animal animal) {
            super(animal);
        }
    
        @Override
        public void getName() {
            System.out.println("黄色的");
            super.getName();
        }
    }
    package com.wms.structural.decorator;
    
    public class WhiteAnimalDecorator extends AnimalDecorator {
        public WhiteAnimalDecorator(Animal animal) {
            super(animal);
        }
    
        @Override
        public void getName() {
            System.out.println("白色的");
            super.getName();
        }
    }

     客户端:

    package com.wms.structural.decorator;
    
    public class Test {
        public static void main(String[] args) {
    
            AnimalDecorator decorator = new YellowAnimalDecotator(new Pig());
            decorator.getName();
    
            decorator = new YellowAnimalDecotator(new Cat());
            decorator.getName();
        }
    }
  • 相关阅读:
    深入理解java:2.3.1. 并发编程concurrent包 之Atomic原子操作(循环CAS)
    深入理解java:2.3. 并发编程 java.util.concurrent包
    深入理解java:2.2. 同步锁Synchronized及其实现原理
    深入理解java:2.1. volatile的使用及其原理
    深入理解java:2. 多线程机制
    深入理解java:1.3.2 JVM监控与调优
    深入理解java:1.3.1 JVM内存区域的划分(运行时数据区)
    深入理解java:1.3. 垃圾收集
    深入理解java:1.2. 字节码执行引擎
    线程的等待与唤醒,实现if...else里面的值交互依次输出
  • 原文地址:https://www.cnblogs.com/wangmingshun/p/10230470.html
Copyright © 2020-2023  润新知