組合模式例子

因爲軟件體系結構書上的例子據說並不太適合用組合模式去解決,又苦於無法想出符合組合模式使用方式的例子,因此搜索了一個相關例

組合模式:將對象組合成樹形結構以表示部分整體的關係,Composite使得用戶對單個對象和組合對象的使用具有一致性。

1、建一個普通接口,裏面有一個抽象方法



2、建兩個普通的對象實現它





3、建一個特殊的類(組合對象)實現它,這個類是組合模式的核心:



4.測試類



打印結果:

 

代碼如下:

/**
* 外形接口
*
* @author Administrator
*/
public interface Shape {
/**
* 圖的方法
*/
void draw();
}


public class Line implements Shape {

/**
* 實現接口的方法:線的畫法
*/
public void draw() {
System.out.println("線的畫法!");
}
}


public class Circle implements Shape {
/**
* 圓的畫法
*/
public void draw() {
System.out.println("圓的畫法!");
}
}


import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
* 同樣是實現了Shape,那麼意味着,這個類實例出來也是一個Shape 有別於Line和Circle類,這個類多了一個add()方法用來添加Shape對象
* 言下之意就是,這個Shape的子類可以存放多個Shape對象 這個Shape對象和Line和Circle類一樣,都實現了接口中的draw()方法;
* 所以這裏的draw()方法就是把添加進來的shape對象循環輸出,保證調用的地方 只要統一調用draw()方法即可。
* 組合模式(Composite)的核心:使得用戶對單個對象和組合對象的使用具有一致性
*
* @author Administrator
*
*/
public class Drawing implements Shape {

private List<Shape> list;

/**
* 無參實例
*/
public Drawing() {
list = new ArrayList<Shape>();
}

/**
* 添加一個Shape對象
*/
public void add(Shape shape) {
list.add(shape);
}

/**
* 實現接口的統一調用方法
*/
public void draw() {
for (Iterator iter = list.iterator(); iter.hasNext();) {
Shape tempShape = (Shape) iter.next();
tempShape.draw();
}
}

}


/**
* 測試組合模式
*
* @author Administrator
*
*/
public class TestComposite {

public static void main(String[] args) {
Shape[] array = new Shape[3];

// 前兩個都是單個Shape對象
array[0] = new Line();
array[1] = new Circle();

// 難點:這個Drawing實現了Shape,所以它也是一個Shape,只是它多了一個添加Shape對象的方法
// 所以這個是個Shape的組合對象,【這個Shape存放Shape對象的集合】,這個Shape裏可以含有多個Shape對象
Drawing dwg = new Drawing();
dwg.add(new Line());
dwg.add(new Circle());

array[2] = dwg;

// 畫出所有的圖形,注意:用一致的方式(都是調用draw();)來訪問所有對象
for (int i = 0; i < 3; ++i) {
System.out.println("數組" + (i + 1) + "的對象如下:");
array[i].draw();
}
}
}

通過這樣的一個畫圖用方法可以聯想到不少有關的組合模式例子,上述例子並不完善,如需參考可根據自己對組合模式的理解去進行修改。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章