— 设计模式 — 1 min read
Attach additional responsibilities to an object dynamically keeping the same interface.Decorators provide a flexible alternative to subclassing for extending functionality.(动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。)
对象结构型模式
装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任,换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展。
最原始的接口或抽象类,最核心的对象
抽象构件的具体实现,内部实现了一写功能,被修饰的类就是这个。
抽象装饰类,内部持有一个 Component。
抽象装饰类的具体实现,通过覆写父类的方法定义新的功能,一般都会调用抽象类内部具体构件
的方法上进行新功能的编排。
需要扩展一个类的功能,或给一个类增加附加功能,并且要求不能修改原有的类或者不能被继承的类。
需要动态地给一个对象增加功能,这些功能可以再动态地撤销。
需要为一批的兄弟类进行改装或加装功能,当然是首选装饰模式。
以生产 Iphone 为例子,需要生产电池、屏幕、充电器,最后组装 iPhone ,具体构件以 iPhone 生产大厂富士康为例。
定义接口生产电池和屏幕。
1interface ProductionIPhone{2
3 void productionBattery();4
5 void productionScreen();6
7}
具体交给富士康生产电池和屏幕。
1class FuShiKang implements ProductionIPhone{2
3 @Override4 public void productionBattery() {5 System.out.println("FuShiKang production the iphone battery");6 }7
8 @Override9 public void productionScreen() {10 System.out.println("FuShiKang production the iphone screen");11 }12}
定义一个富士康的抽象装饰类,以便日后拓展生产其他 iPhone 需要的硬件。
1abstract class FuShiKangDecorator implements ProductionIPhone{2
3 private ProductionIPhone productionIPhone;4
5 public FuShiKangDecorator(ProductionIPhone productionIPhone) {6 this.productionIPhone = productionIPhone;7 }8
9 @Override10 public void productionBattery() {11 productionIPhone.productionBattery();12 }13
14 @Override15 public void productionScreen() {16 productionIPhone.productionScreen();17 }18}
1//第一个具体装饰类我们让富士康在生产电池和屏幕外在拓展生产充电器2class Decorator01 extends FuShiKangDecorator{3
4 public Decorator01(ProductionIPhone productionIPhone) {5 super(productionIPhone);6 }7 //生产充电器8 public void productionCharger(){9 System.out.println("FuShiKang production the iphone Charger too");10 }11
12
13 @Override14 public void productionBattery() {15 /**16 * Decorator抽象类的子类(具体装饰者),里面都有一个构造方法调用super,这一句就体现了抽象类依赖于子类实现即抽象依赖于实现的原则17 */18 super.productionBattery();19 //把充电器放在电池后生产20 productionCharger();21 }22
23 @Override24 public void productionScreen() {25 super.productionScreen();26 }27}28//第二个具体装饰类,这时候我们要求富士康可以组装 iPhone29class Decorator02 extends FuShiKangDecorator{30
31 public Decorator02(ProductionIPhone productionIPhone) {32 super(productionIPhone);33 }34 //拓展组装 iPhone 的功能35 public void assembleIPhone(){36 System.out.println("Started assemble iphone");37 }38
39
40 @Override41 public void productionBattery() {42 super.productionBattery();43 }44
45 @Override46 public void productionScreen() {47 super.productionScreen();48 //在生产完屏幕后,开始组装 iPhone49 assembleIPhone();50 }51}
1public class DecoratorPattern {2
3 public static void main(String[] args) {4 ProductionIPhone productionIPhone = new FuShiKang();5 //第一层装饰,装饰完后可以生产充电器6 ProductionIPhone decorator1 = new Decorator01(productionIPhone)7 //第二层装饰,装饰完后富士康已经可以组装 iPhone 了8 ProductionIPhone decorator = new Decorator02(decorator1);9 decorator.productionBattery();10 decorator.productionScreen();11 }12}
1FuShiKang production the iphone battery2FuShiKang production the iphone Charger too3FuShiKang production the iphone screen4Started assemble iphone
设计模式 设计模式之禅 3. 装饰模式 — Graphic Design Patterns