設計模式之Decorator——家裝篇(原創)

設計模式之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提供了"即插即用"的方法,在運行期間決定何時增加何種功能.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章