设计模式-装饰者模式

一、定义

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

角色:

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();
    }
}

 

posted @ 2019-01-06 21:37  请叫我大表哥  阅读(173)  评论(0编辑  收藏  举报