设计模式之Decorator——家装篇 
  
最近家里搞装修,做了一套家具,需要刷一下漆,因此我就去市场找了油漆师傅和油漆徒弟两个人。 
油漆师傅主要买油漆和调油漆,油漆徒弟主要来刷油漆(团队精神?哈哈,不禁让让我想起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提供了"即插即用"的方法,在运行期间决定何时增加何种功能. 
   
 
  |