1. 程式人生 > >Java設計模式之Builder和Decorator

Java設計模式之Builder和Decorator

                                           Java設計模式

                                      之

                           Builder和Decorator

1、建造者模式(Builder)

工廠類模式提供的是建立單個類的模式,而建造者模式則是將各種產品集中起來進行管理,用來建立複合物件,所謂複合物件就是指某個類具有不同的屬性,其實建造者模式就是前面抽象工廠模式和最後的Test結合起來得到的。我們看一下程式碼:

一個Sender介面,兩個實現類MailSender和SmsSender。最後,建造者類如下:

1.  public class Builder {  

2.        

3.      private List<Sender> list = new ArrayList<Sender>();  

4.        

5.      public void produceMailSender(int count){  

6.          for(int i=0; i<count; i++){  

7.              list.add(new MailSender());  

8.          }  

9.      }  

10.

      

11.     public void produceSmsSender(int count){  

12.         for(int i=0; i<count; i++){  

13.             list.add(new SmsSender());  

14.         }  

15.     }  

16.

測試類:

1.  public class Test {  

2.      public static void main(String[] args) {  

3.          Builder builder = new

 Builder();  

4.          builder.produceMailSender(10);  

5.      }  

6.  }  

從這點看出,建造者模式將很多功能整合到一個類裡,這個類可以創造出比較複雜的東西。所以與工程模式的區別就是:工廠模式關注的是建立單個產品,而建造者模式則關注建立符合物件,多個部分。因此,是選擇工廠模式還是建造者模式,依實際情況而定。

2、裝飾模式(decorator)

顧名思義,裝飾模式就是給一個物件增加一些新的功能,而且是動態的,要求裝飾物件和被裝飾物件實現同一個介面,裝飾物件持有被裝飾物件的例項,關係圖如下:

Source類是被裝飾類,Decorator類是一個裝飾類,可以為Source類動態的新增一些功能,程式碼如下:

定義一個Sourceable介面,並在裡面定義某個方法。

1.  public interface Sourceable {  

2.      public void method();  

3. 

建立一個Source類並實現Sourceable介面。

1.  public class Source implements Sourceable {  

2.      @Override  

3.      public void method() {  

4.          System.out.println("the original method!");  

5.      }  

6. 

建立一個Decorator類,它也實現了Sourceable介面。並且有一個帶參的建構函式,引數就是Sourceable介面。

1.  public class Decorator implements Sourceable {  

2.    

3.      private Sourceable source; 

4.      public Decorator(Sourceable source){  

5.          super();  

6.          this.source = source;  

7.      }  

8.      @Override  

9.      public void method() {  

10.         System.out.println("before decorator!");  

11.         source.method();  

12.         System.out.println("after decorator!");  

13.     }  

14. }  

測試類:

1.  public class DecoratorTest {  

2.    

3.      public static void main(String[] args) {  

4.          Sourceable source = new Source();  

5.          Sourceable obj = new Decorator(source);  

6.          obj.method();  

7.      }  

8. 

輸出:

before decorator!
the original method!
after decorator!

裝飾器模式的應用場景:

1、需要擴充套件一個類的功能。

2、動態的為一個物件增加功能,而且還能動態撤銷。(繼承不能做到這一點,繼承的功能是靜態的,不能動態增刪。)

缺點:產生過多相似的物件,不易排錯!