Design Pattern学习笔记 --- Composite(组合)模式

㈠意图:

  Composite(组合)模式属于对象结构型模式.它将对象组合成树形结构以表示"部分-整体"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性.

㈡实例:

  考虑一个七巧板的拼图游戏.

  一般所提供的基本图形:三角形和方形.我们使用这两类基本图形按照图纸可以拼接成许多不同的组合图形;

  如果按照正常的对象结构模式.当我们每要拼接一个新的图形时,我们都需要为它创建一个新的对象(类).这个组合对象相当于一个容器;里面按照算法和属性组合了这些基本图形.

  然而这种方法存在一个问题:使用这些类的代码必须区别基本图形和组合图形.无法用统一的方式去使用基本图形和组合图形.

  而使用composite模式则可以很好地解决这个问题;结构如下:

 

对应的结构:

 

㈢UML图:

㈣场景对照:

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()方法和相应的增加元素的方法即可;而在客户端调用画图形的方法是不需要更改的;

你可能感兴趣的:(java,设计模式,composite)