概括
|
名稱 |
Composite |
|
結構 |
|
|
動機 |
將對象組合成樹形結構以表示?部分-整體?的階層。C o m p o s i t e 使得使用者對單個對象和組合對象的使用具有一致性。 |
|
適用性 |
|
解析
形象比喻:
COMPOSITE—Mary今天過生日。“我過生日,你要送我一件禮物。”“嗯,好吧,去商店,你自己挑。”“這件T恤挺漂亮,買,這條裙子好看,買,這個包也不錯,買。”“喂,買了三件了呀,我只答應送一件禮物的哦。”“什麼呀,T恤加裙子加包包,正好配成一套呀,小姐,麻煩你包起來。”“……”,MM都會用Composite模式了,你會了沒有?
合成模式:合成模式將對象組織到樹結構中,可以用來描述整體與部分的關係。合成模式就是一個處理對象的樹結構的模式。合成模式把部分與整體的關係用樹結構表示出來。合成模式使得用戶端把一個個單獨的成分對象和由他們複合而成的合成對象同等看待。
1.Component
為組合中的對象聲明介面。
在適當的情況下,實現所有類共有介面的預設行為。
聲明一個介面用於訪問和管理Component的子組件。
(可選)在遞迴結構中定義一個介面,用於訪問一個父組件,並在合*的情況下實現它。
2.Leaf
在組合中表示分葉節點對象,分葉節點沒有子節點。
在組合中定義節點對象的行為。
3.Composite
定義有子組件的*些組件的行為。
儲存子組件。
在Component介面中實現與子組件有*的操作。
4.Client
通過Component介面操縱組合組件的對象。
執行個體
舉例來說,一件產品可能是由多個產品(組件)組成起來的。
這個例子目的是一個軟體產品可以由多個軟體產品或組件組合而成。
涉及的檔案有:
Product.java -- 抽象父類
-- SoftwareProduct.java
-- ProductPart.java
TestMain.java
/** * @author oscar999 * @date 2013-7-25 * @version V1.0 */package designptn.composite;import java.util.List;public abstract class Product {private String name;/** * @return the name */public String getName() {return name;}/** * @param name * the name to set */public void setName(String name) {this.name = name;}public abstract void add(Product product);public abstract void delete(Product product);public List<Product> products;public void printInfo() {System.out.println(name);}public List<Product> getProducts() {return this.products;}}
/** * @author oscar999 * @date 2013-7-25* @version V1.0 */package designptn.composite;import java.util.ArrayList;public class SoftwareProduct extends Product {public SoftwareProduct(String name){setName(name);this.products = new ArrayList<Product>();}@Overridepublic void add(Product product) {// TODO Auto-generated method stubthis.products.add(product);}@Overridepublic void delete(Product product) {// TODO Auto-generated method stubthis.products.remove(product);}}
/** * @author oscar999 * @date 2013-7-25 * @version V1.0 */package designptn.composite;public class ProductPart extends Product {public ProductPart(String name) {setName(name);this.products = null;}@Overridepublic void add(Product product) {// TODO Auto-generated method stub}@Overridepublic void delete(Product product) {// TODO Auto-generated method stub}}
/** * @author oscar999 * @date 2013-7-25 * @version V1.0 */package designptn.composite;import java.util.List;public class TestMain {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubProduct product = new SoftwareProduct("Software Product");Product subProduct = new SoftwareProduct("Sub Software Product");Product part1 = new ProductPart("Part 1");Product part2 = new ProductPart("Part 2");product.add(subProduct);product.add(part1);product.add(part2);List<Product> products = product.getProducts();for(Product productTemp : products){System.out.println(productTemp.getName());}}}