设计模式-装饰者模式
一、定义
动态的给一个对象添加一些额外的职责。就增加功能来说,装饰者相比生成子类更灵活。
角色:
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(); } }