使用装饰器设计模式。
这是装饰器模式的简化示例。(改编自互联网和 polygenelubricants 对 SO 的回答)
注意:在我们开始从接口中删除 abstract 关键字之前,这是错误的语法
类层次结构被重组为static
内部类,以便整个示例包含在一个编译单元中(如 ideone.com 上所示):
这是预期类层次结构的图表概述
public class AnimalDecorator {
static interface Animal {
public String makeNoise();
public void wagTail();
//other methods
}
static class Dog implements Animal {
public final String makeNoise() { return "woof"; }
public final void wagTail() { //do wag tail action }
}
static class DogDecorator implements Animal {
//delegate
private Animal animal;
public DogDecorator (Animal animal){this.animal = animal;}
public String makeNoise() { animal.makeNoise();}
public void wagTail() { animal.wagTail();}
}
static class LoudDog extends DogDecorator {
@Override public String makeNoise() {
return "WOOF WOOF WOOF!!!";
}
}
}
所以这里我们有一个简单的Animal
层次结构,带有Dog
子类。我们还有一个DogDecorator
装饰器——也是一个Animal
——简单地将所有方法委托给另一个Animal
。也就是说,它并没有真正做任何有效的装饰,但它已经准备好被子类化,以便可以添加实际的装饰。
我们这里只有两种方法,makeNoise()
和wagTail()
。然后我们创建我们想要的类LoudDog
并使用它。(考虑Animal
有很多方法的情况;那么Normal
将是最有价值的)。
请注意,我们甚至可以将一种装饰堆叠在另一种之上。确切的实现细节可能会有所不同,但这个简化的示例几乎抓住了装饰器模式的精髓。
脚步
- 将原始“组件”类子类化为“装饰器”类(参见 UML 图);
- 在 Decorator 类中,添加一个 Component 指针作为字段;
- 传递一个 Component 给 Decorator 构造函数来初始化 Component 指针;
- 在装饰器类中,将所有“组件”方法重定向到“组件”指针;和
- 在 ConcreteDecorator 类中,覆盖任何需要修改其行为的组件方法。
也可以看看
- Effective Java 第 2 版,第 18 条:首选接口胜于抽象类
相关问题