装饰模式:
装饰很容易理解,我们人类穿衣服除了为了御寒,其实也是为了装饰,毕竟人靠衣服马靠鞍嘛。
同理,装饰模式把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象。
不太理解,不要紧,我们先来看一个简单的装饰模式的例子,你就明白了。
装饰模式的例子:
Person类:
public class Person {
private String name;
public Person() {}
public Person(String name) {
this.name = name;
}
public void show() {
System.out.println(name + "的装扮:");
}
}
服装类(Finery类)
public class Finery extends Person {
protected Person component;
public void Decorate(Person component) {
this.component = component;
}
@Override
public void show() {
if(component != null) {
component.show();
}
}
}
具体服装类
public class TShirts extends Finery {
@Override
public void show() {
super.show();
System.out.print("T恤 ");
}
}
下面是客户端测试装饰模式
public class Client {
public static void main(String[] args) {
//adam的换装
Person adam = new Person("adam");
Suits a = new Suits(); // 西装
Tie b = new Tie(); // 领带
LeatherShoes c = new LeatherShoes(); //皮鞋
a.Decorate(adam);
b.Decorate(a);
c.Decorate(b);
c.show();
System.out.println("\n--------------");
//bill的换装
Person bill = new Person("bill");
TShirts x = new TShirts(); // T恤
Trouser y = new Trouser(); // 裤子
Sneakers z = new Sneakers(); // 运动鞋
x.Decorate(bill);
y.Decorate(x);
z.Decorate(y);
z.show();
}
}
运行结果:
adam的装扮:
西装 领带 皮鞋
--------------
bill的装扮:
T恤 裤子 运动鞋
平常当系统需要新功能时,是向旧的类中添加新的代码,这些新加的代码通常装饰了原有类的核心职责或主要行为,这种做法的问题在于,它们在主类中加入了新的字段、新的方法和新的逻辑,从而增加了主类的复杂度,而这些新加入的东西仅仅是为了满足一些只在某种特定情况下才会执行的特殊行为的需要。
而装饰模式却提供了一个非常好的解决方案,它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象。因此当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择地、按顺序地使用装饰功能包装对象了。