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();
        }
    }
  • 相关阅读:
    九度OJ 1131:合唱队形 (DP、最长上升下降序列)
    九度OJ 1130:日志排序 (排序)
    九度OJ 1129:Skew数 (大数运算)
    九度OJ 1128:求平均年龄 (基础题)
    九度OJ 1127:简单密码 (翻译)
    九度OJ 1126:打印极值点下标 (基础题)
    九度OJ 1125:大整数的因子 (大数运算)
    九度OJ 1124:Digital Roots(数根) (递归)
    存储过程
    Cookie 和 Session
  • 原文地址:https://www.cnblogs.com/wangmingshun/p/10230470.html
Copyright © 2011-2022 走看看