大话设计模式读书笔记系列-3.装饰者模式
>>>大话设计模式读书笔记系列目录>>>
装饰者模式
动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活.
场景:
通过给小明穿衣服来演示装饰者模式
被装饰的人类
/** * 被装饰的人 */ public class Person { /** * 名字 */ private String name; /** * 构造函数 * * @param name */ public Person(String name) { this.name = name; } public Person() { } public void show() { System.out.println(MessageFormat.format("装扮的{0}", this.name)); } }
服饰类
/** * 服饰类 */ public class Finery extends Person { /** * 成员 */ protected Person component; /** * 打扮 * * @param component */ public void decorate(Person component) { this.component = component; } @Override public void show() { if (this.component != null) { this.component.show(); } } }
服饰子类
/** * T恤类 */ public class TShirts extends Finery { @Override public void show() { System.out.println("大体恤 "); super.show(); } } /** * 垮裤类 */ public class BigTrouset extends Finery { @Override public void show() { System.out.println("垮裤 "); super.show(); } } /** * 破鞋子类 */ public class BrokenShoes extends Finery { @Override public void show() { System.out.println("破鞋子 "); super.show(); } }
调用:
/** * 大话设计模式(java版) * 第三章:装饰者设计模式 */ public class DecoratorDemo { public static void main(String[] args) { Person person=new Person("小明"); System.out.println("装扮风格: "); //T恤 TShirts tShirts=new TShirts(); //垮裤 BigTrouset bigTrouset =new BigTrouset(); //破鞋子 BrokenShoes brokenShoes=new BrokenShoes(); //装饰小明 tShirts.decorate(person); //装饰T恤 bigTrouset.decorate(tShirts); //装饰垮裤 brokenShoes.decorate(bigTrouset); brokenShoes.show(); } }
结果
装扮风格:
破鞋子
垮裤
大体恤
装扮的小明
解析:
1.需要把所需的功能按正确的顺序串联起来进行控制.
2.装饰模式是为已有功能动态的添加更多功能的一种方式.
3.当系统需要新的功能的时候,是向旧的类中添加新的代码.这样新加的代码通常装饰了原有类的核心职责或主要行为.
4.再主类中加入了新的字段,新的方法和新的逻辑,从而增加了主类的复杂度,二这些新加入的东西仅仅是为了满足一些只在某种特定情况下才会执行的特殊行为需要,装饰模式却提供了一个非常好的解决方案,他吧每个要装饰的功能放在单独的类中,并让这个类包装他所要装饰的对象,因此,当需要执行特殊行为时,客户端代码就可以在运行时根据需要有选择、按顺序地使用装饰功能包装对象.
5.装饰模式的优点,把类中的装饰功能从类中搬移去除,这样可以简化原有的类,有效的把类的核心职责和装饰功能区分开了,而且可以去除相关类中重复的装饰逻辑.