动态地给一个对象添加一些额外地职责,就增加功能来说,装饰模式比生成子类更为灵活。
QQ 装扮,一个人有 N种装扮方式,我们需要把所需地功能按正确地顺序串联起来进行控制。
实现一个 QQ装扮功能
package decoratorPattern;
/**
* Created by yutong on 2018/11/12
* 基类 人
*/
public class Person {
private String name;
public Person(){
}
public Person(String name){
this.name = name;
}
public void show(){
System.out.println("开始装扮的艾希");
}
}
package decoratorPattern;
/**
* Created by yutong on 2018/11/12
* 装扮类
*/
public class Decorator extends Person {
private Person person;
public Decorator(Person person){
super();
this.person = person;
}
public void show(){
person.show();
}
}
package decoratorPattern;
/**
* Created by yutong on 2018/11/12
* 穿T恤
*/
public class TShirts extends Decorator {
public TShirts(Person person) {
super(person);
}
public void show(){
super.show();
System.out.println("穿T恤");
}
}
package decoratorPattern;
/**
* Created by yutong on 2018/11/12
* 穿裤子
*/
public class BigTrouser extends Decorator {
public BigTrouser(Person person) {
super(person);
}
@Override
public void show() {
super.show();
System.out.println("穿裤子");
}
}
package decoratorPattern;
/**
* Created by yutong on 2018/11/12
* 穿鞋
*/
public class Shoes extends Decorator{
public Shoes(Person person) {
super(person);
}
@Override
public void show() {
super.show();
System.out.println("穿皮鞋");
}
}
package decoratorPattern;
/**
* Created by yutong on 2018/11/12
* QQ装饰
*/
public class QQClient {
public static void main(String[] args){
Person person = new Person("艾希");
Decorator tshirts = new TShirts(person);
Decorator bigTrourser = new BigTrouser(tshirts);
Decorator shoes = new Shoes(bigTrourser);
shoes.show();
}
}
输出结果:
开始装扮的艾希
穿T恤
穿裤子
皮鞋
装饰模式是为已有功能动态添加更多功能的一种形式。
当系统需要新功能的时候,是向旧的类中添加新代码。这些新加的代码通常装饰了原有累的核心职责或主要行为,而这些新加入的东西仅仅是为了满足一些只有在特定情况下才会执行的特殊行为需要。装饰模式提供了一个非常好的解决方案。它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当执行特殊行为时,客户代码就可以在运行时更加需要有选择的,按顺序的使用装饰功能包装对象。
把类中的装饰功能从类中搬移出去,这样可以简化原有的类,最大的好处就是有效的把类的核心职责和装饰功能区分开,而且可以去除相关类中重复的装饰逻辑。
由于使用装饰模式,可以比使用继承关系需要较少数目的类。使用较少的类,当然使设计比较易于进行。但是,在另一方面,使用装饰模式会产生比使用继承关系更多的对象。更多的对象会使得查错变得困难,特别是这些对象看上去都很相像。