第八章 装饰模式
程序员文章站
2022-05-17 17:27:24
...
1.装饰模式
动态地给对象添加一些额外的职责。就功能来说装饰模式相比生成子类更为灵活。
动态地扩展一个对象的功能,而不需要改变原始类代码的一种成熟模式。
在装饰模式中,“具体组件”类和“具体装饰”类是该模式中的最重要的两个角色。
2装饰模式-结构
装饰模式的结构中包括四种角色:
- 抽象组件(Component)
- 具体组件(ConcreteComponent)
- 装饰(Decorator)
- 具体装饰(ConcreteDecotator)
装饰模式的核心就是在于装饰的构造方法关联了抽象组件的引用,而具体组件和具体装饰都是属于抽象组件的子类,所以在构造具体装饰的时候,可以把不同的具体装饰作为引用来构造自己,即实现责任的扩充。
3装饰模式-场景描述
麻雀可以在飞100米的基础上连续飞50米
4装饰模式-场景分析
- 抽象组件
鸟 Bird - 具体组件
麻雀 Sparrow - 装饰
装饰 Decorator - 具体装饰
具体装饰 SparrowDecorator
5装饰模式-代码实现
package patterns.decorator; /** * 抽象组件 * @author Administrator * */ public abstract class Bird { public abstract double fly(); } package patterns.decorator; /** * 具体组件 * @author Administrator * */ public class Sparrow extends Bird { @Override public double fly() { return 100; } } package patterns.decorator; /** * 装饰角色 * @author Administrator * */ public abstract class Decorator extends Bird { public Bird bird; public Decorator(Bird bird) { this.bird = bird; } } package patterns.decorator; /** * 具体装饰角色 * @author Administrator * */ public class SparrowDecorator extends Decorator { public double DISTANCE = 50; public SparrowDecorator(Bird bird) { super(bird); } @Override public double fly() { return bird.fly()+DISTANCE; } } package patterns.decorator; public class Client { public static void main(String[] args) { Bird bird = new Sparrow(); System.out.println(bird.fly()); Decorator decorator = new SparrowDecorator(bird); System.out.println(decorator.fly()); Decorator decorator2 = new SparrowDecorator(decorator); System.out.println(decorator2.fly()); } }