zoukankan      html  css  js  c++  java
  • 设计模式-装饰者模式

    一、定义

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

    角色:

    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();
        }
    }
  • 相关阅读:
    封装异常处理之坑
    30multipart/form-data和application/x-www-form-urlencoded的区别(二)urlencoded之自动deocde
    使用MAT时的Shallow Size和 Retained Size的区别
    当动态代理遇到ioc
    线程池的原理
    synchroned原理与对象头(yet)
    mysql压力测试与qps监控
    一种mysql jvm死锁
    Android Jni变量对照表
    结构体中使用函数指针
  • 原文地址:https://www.cnblogs.com/wangmingshun/p/10230470.html
Copyright © 2011-2022 走看看