设计模式之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提供了"即插即用"的方法,在运行期间决定何时增加何种功能 
               
             
               
             |