設計模式之Decorator——家裝篇<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
最近家裏搞裝修,做了一套傢俱,需要刷一下漆,因此我就去市場找了油漆師傅和油漆徒弟兩個人。
油漆師傅主要買油漆和調油漆,油漆徒弟主要來刷油漆(團隊精神?哈哈,不禁讓讓我想起CS,你先衝,我揀菜。)。
1、在這裏,我們先把這個油漆工作定義成一個接口類:
public interface Work
{
public void brush(); //刷油漆
}
2、因爲油漆師傅和油漆徒弟的任務是刷油漆,因此他們要對Work接口進行實現:
A:油漆徒弟
刷油漆的工作主要是由油漆徒弟來完成,所以我們把油漆徒弟定義成Brusher(油漆師傅在一旁說:“徒弟嗎,就是要多幹活。”,油漆徒弟小聲嘀咕:“多你個頭。”)。
public class Brusher implements Work{
public void brush() {
System.out.println("刷油漆");
}
}
B:油漆師傅
我們把油漆師傅定義成Decorator。
public class Decorator implements Work{
private Work work;
//油漆師傅的工作被放置在這個List中
private ArrayList prework = new ArrayList();
//油漆師傅的默認工作
public Decorator(Work work) {
this.work = work;
prework.add("買油漆");
prework.add("調油漆");
}
public void brush() {//刷油漆, 油漆師傅也要實現此方法
newWork(); //當油漆師傅接到活,就開始一個新的工作
}
//新的工作
public void newWork() {
preWork(); //油漆師傅做的前期輔助工作
work.brush(); //讓徒弟乾的刷油漆的工作
}
//油漆師傅做的前期輔助工作
public void preWork() {
ListIterator listIterator = prework.listIterator();
while (listIterator.hasNext()) {
System.out.println( ( (String) (listIterator.next())) + "完成");
}
}
3、編寫測試類:
public class test {
public static void main(String args[]) {
Work bursher = new Brusher();
Work decorator = new Decorator(bursher);
decorator.brush();
//我把活交給油漆師傅,油漆師傅下來再把實際刷油漆的工作指派給油漆徒弟幹
}
4、說明:
A:代碼只用來學習Decorator模式,要運行的話,必須要做一點改動。
B:在這過程中,我只和油漆師傅打交道,具體的刷油漆那是由油漆師傅和油漆徒弟之間的事,我是不用關心的。
C:使用Decorator的理由是:這些功能需要由用戶動態決定加入的方式和時機.Decorator提供了"即插即用"的方法,在運行期間決定何時增加何種功能.