Design Pattern學習筆記 --- Composite(組合)模式

㈠意圖:java

  Composite(組合)模式屬於對象結構型模式.它將對象組合成樹形結構以表示"部分-總體"的層次結構.Composite使得用戶對單個對象和組合對象的使用具備一致性.算法

㈡實例:ide

  考慮一個七巧板的拼圖遊戲.測試

  通常所提供的基本圖形:三角形和方形.咱們使用這兩類基本圖形按照圖紙能夠拼接成許多不一樣的組合圖形;spa

  若是按照正常的對象結構模式.當咱們每要拼接一個新的圖形時,咱們都須要爲它建立一個新的對象(類).這個組合對象至關於一個容器;裏面按照算法和屬性組合了這些基本圖形.對象

  然而這種方法存在一個問題:使用這些類的代碼必須區別基本圖形和組合圖形.沒法用統一的方式去使用基本圖形和組合圖形.遊戲

  而使用composite模式則能夠很好地解決這個問題;結構以下: rem

 

對應的結構:get

 

㈢UML圖:string

㈣場景對照:

Component:抽象的Graph類;定義抽象的共有操做而且提供了管理組合不一樣組件的方法;讓子類進行Override.

Leaf: 對應Rectangle和Triangle;

Composite: 對應組合後的House圖形;

㈤代碼實現:

 

  
  
  
  
  1. /** 
  2.  * Composite模式中的抽象Component 
  3.  */ 
  4. package com.skywares.designpattern.composite; 
  5.  
  6. /** 
  7.  * @author Administrator 
  8.  * 
  9.  */ 
  10. public abstract class Graph 
  11.     public abstract void draw(); 
  12.     public void addGraph(Graph g) 
  13.     { 
  14.          
  15.     } 
  16.     public void removeGraph(Graph g) 
  17.     { 
  18.          
  19.     } 
  20.     public Graph getChild(int i) 
  21.     { 
  22.         return null
  23.     } 
  24.      

  

  
  
  
  
  1. /** 
  2.  * Composite模式中的Leaf Component 
  3.  */ 
  4. package com.skywares.designpattern.composite; 
  5.  
  6. /** 
  7.  * @author Administrator 
  8.  * 
  9.  */ 
  10. public class Triangle extends Graph 
  11.  
  12.     @Override 
  13.     public void draw() 
  14.     { 
  15.         System.out.println("draw a triangle ~!"); 
  16.     } 
  17.  
  
  
  
  
  1. /** 
  2.  *  
  3.  */ 
  4. package com.skywares.designpattern.composite; 
  5.  
  6. /** 
  7.  * @author Administrator 
  8.  * 
  9.  */ 
  10. public class Rectangle extends Graph 
  11.     public void draw() 
  12.     { 
  13.         System.out.println("print a rectangle !"); 
  14.     } 
  15.  
  
  
  
  
  1. /** 
  2.  * 測試類 
  3.  */ 
  4. package com.skywares.designpattern.composite; 
  5.  
  6. /** 
  7.  * @author Administrator 
  8.  * 
  9.  */ 
  10. public class Client 
  11.  
  12.     /** 
  13.      * @param args 
  14.      */ 
  15.     public static void main(String[] args) 
  16.     { 
  17.         Graph t = new Triangle(); 
  18.         Graph r = new Rectangle(); 
  19.          
  20.         House h = new House(); 
  21.         h.addGraph(t); 
  22.         h.addGraph(r); 
  23.          
  24.         h.draw(); 
  25.     } 
  
  
  
  
  1. /** 
  2.  * Composite模式中的Component類 
  3.  */ 
  4. package com.skywares.designpattern.composite; 
  5.  
  6. import java.util.ArrayList; 
  7. import java.util.List; 
  8.  
  9. /** 
  10.  * @author Administrator 
  11.  * 
  12.  */ 
  13. public class House extends Graph 
  14.     private List<Graph> graphList = new ArrayList(); 
  15.      
  16.     @Override 
  17.     public void draw() 
  18.     { 
  19.         if(graphList != null && graphList.size() == 2
  20.         { 
  21.             for(Graph g : graphList) 
  22.             { 
  23.                 g.draw(); 
  24.             } 
  25.         } 
  26.     } 
  27.      
  28.     @Override 
  29.     public void addGraph(Graph g) 
  30.     { 
  31.         graphList.add(g); 
  32.     } 
  33.      
  34.     @Override 
  35.     public void removeGraph(Graph g) 
  36.     { 
  37.         graphList.remove(g); 
  38.     } 
  39.      
  40.     /* (non-Javadoc) 
  41.      * @see com.skywares.designpattern.composite.Graph#getChild(int) 
  42.      */ 
  43.     @Override 
  44.     public Graph getChild(int i) 
  45.     { 
  46.         return graphList.get(i); 
  47.     } 
  48.  

這樣之後即便要擴展其它圖形;咱們也只須要重寫它的draw()方法和相應的增長元素的方法便可;而在客戶端調用畫圖形的方法是不須要更改的;

相關文章
相關標籤/搜索