㈠意圖:java
Composite(組合)模式屬於對象結構型模式.它將對象組合成樹形結構以表示"部分-總體"的層次結構.Composite使得用戶對單個對象和組合對象的使用具備一致性.算法
㈡實例:ide
考慮一個七巧板的拼圖遊戲.測試
通常所提供的基本圖形:三角形和方形.咱們使用這兩類基本圖形按照圖紙能夠拼接成許多不一樣的組合圖形;spa
若是按照正常的對象結構模式.當咱們每要拼接一個新的圖形時,咱們都須要爲它建立一個新的對象(類).這個組合對象至關於一個容器;裏面按照算法和屬性組合了這些基本圖形.對象
然而這種方法存在一個問題:使用這些類的代碼必須區別基本圖形和組合圖形.沒法用統一的方式去使用基本圖形和組合圖形.遊戲
而使用composite模式則能夠很好地解決這個問題;結構以下: rem
對應的結構:get
㈢UML圖:string
㈣場景對照:
Component:抽象的Graph類;定義抽象的共有操做而且提供了管理組合不一樣組件的方法;讓子類進行Override.
Leaf: 對應Rectangle和Triangle;
Composite: 對應組合後的House圖形;
㈤代碼實現:
- /**
- * Composite模式中的抽象Component
- */
- package com.skywares.designpattern.composite;
- /**
- * @author Administrator
- *
- */
- public abstract class Graph
- {
- public abstract void draw();
- public void addGraph(Graph g)
- {
- }
- public void removeGraph(Graph g)
- {
- }
- public Graph getChild(int i)
- {
- return null;
- }
- }
- /**
- * Composite模式中的Leaf Component
- */
- package com.skywares.designpattern.composite;
- /**
- * @author Administrator
- *
- */
- public class Triangle extends Graph
- {
- @Override
- public void draw()
- {
- System.out.println("draw a triangle ~!");
- }
- }
- /**
- *
- */
- package com.skywares.designpattern.composite;
- /**
- * @author Administrator
- *
- */
- public class Rectangle extends Graph
- {
- public void draw()
- {
- System.out.println("print a rectangle !");
- }
- }
- /**
- * 測試類
- */
- package com.skywares.designpattern.composite;
- /**
- * @author Administrator
- *
- */
- public class Client
- {
- /**
- * @param args
- */
- public static void main(String[] args)
- {
- Graph t = new Triangle();
- Graph r = new Rectangle();
- House h = new House();
- h.addGraph(t);
- h.addGraph(r);
- h.draw();
- }
- }
- /**
- * Composite模式中的Component類
- */
- package com.skywares.designpattern.composite;
- import java.util.ArrayList;
- import java.util.List;
- /**
- * @author Administrator
- *
- */
- public class House extends Graph
- {
- private List<Graph> graphList = new ArrayList();
- @Override
- public void draw()
- {
- if(graphList != null && graphList.size() == 2)
- {
- for(Graph g : graphList)
- {
- g.draw();
- }
- }
- }
- @Override
- public void addGraph(Graph g)
- {
- graphList.add(g);
- }
- @Override
- public void removeGraph(Graph g)
- {
- graphList.remove(g);
- }
- /* (non-Javadoc)
- * @see com.skywares.designpattern.composite.Graph#getChild(int)
- */
- @Override
- public Graph getChild(int i)
- {
- return graphList.get(i);
- }
- }
這樣之後即便要擴展其它圖形;咱們也只須要重寫它的draw()方法和相應的增長元素的方法便可;而在客戶端調用畫圖形的方法是不須要更改的;