裝飾模式
概述
動態地給一個對象添加一些額外的職責。就增加功能來說,Decorator模式相比生成子類更爲靈活。
適用性
1.在不影響其他對象的情況下,以動態、透明的方式給單個對象添加職責。
2.處理那些可以撤消的職責。
3.當不能採用生成子類的方法進行擴充時。
參與者
1.Component
定義一個對象接口,可以給這些對象動態地添加職責。
2.ConcreteComponent
定義一個對象,可以給這個對象添加一些職責。
3.Decorator
維持一個指向Component對象的指針,並定義一個與Component接口一致的接口。
4.ConcreteDecorator
向組件添加職責。
類圖
例子
Component
public interface Person {
void eat();
}
ConcreteComponent
public class Man implements Person {
public void eat() {
System.out.println("男人在吃");
}
}
Decorator
public abstract class Decorator implements Person {
protected Person person;
public void setPerson(Person person) {
this.person = person;
}
public void eat() {
person.eat();
}
}
ConcreteDecorator
public class ManDecoratorA extends Decorator {
public void eat() {
super.eat();
reEat();
System.out.println("ManDecoratorA類");
}
public void reEat() {
System.out.println("再吃一頓飯");
}
}
public class ManDecoratorB extends Decorator {
public void eat() {
super.eat();
System.out.println("===============");
System.out.println("ManDecoratorB類");
}
}
Test
public class Test {
public static void main(String[] args) {
Man man = new Man();
ManDecoratorA md1 = new ManDecoratorA();
ManDecoratorB md2 = new ManDecoratorB();
md1.setPerson(man);
md2.setPerson(md1);
md2.eat();
}
}
result
男人在吃
再吃一頓飯
ManDecoratorA類
ManDecoratorB類
Copyright © 2008 Angus Young
瘋狂Java聯盟:http://www.crazyit.org