装饰模式
装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
组成:
- Component:给出一个抽象接口,以规范准备接收附加责任的对象。
- Concrete Component:定义一个将要接收附加责任的类,需要被装饰的类。
- Decorator:持有一个构件(Component)对象的实例,并实现一个与抽象构件接口一致的接口。
- Concrete Decorator:负责给构件对象添加上附加的责任,具体的装饰类。
优点:
- 通过使用不同的装饰类以及装饰类组合以及装饰类的排列组合,可以创造出不同的行为组合。
- 扩展新的行为较为容易,可扩展性强。
缺点:
装饰模式会导致设计中出现许多小类,如果过度使用,会使程序变得很复杂。
简化版:
- 如果只有一个Concrete Component类而没有抽象的Component接口时,可以让Decorator继承Concrete Component。
- 如果只有一个Concrete Decorator类时,可以将Decorator和Concrete Decorator合并。
类图:
代码实现:
public interface Componet { public void operation(); }
public class DecreteComponet implements Componet { @Override public void operation() { System.out.println("Duck"); } }
public class Decorator implements Componet { Componet componet; public Decorator(Componet componet) { this.componet = componet; } @Override public void operation() { componet.operation(); } }
public class DecreteDecoratorA extends Decorator { public DecreteDecoratorA(Componet componet) { super(componet); } @Override public void operation() { //addbehaviorA(); 也可以放前面 super.operation(); addbehaviorA(); } public void addbehaviorA(){ System.out.println("can fly!"); } }
public class Client { public static void main(String[] args) { Componet componet = new DecreteComponet(); Decorator decorator = new DecreteDecoratorA(componet); decorator.operation(); } }