[設計模式-結構型]組合(Composite )

來源:互聯網
上載者:User
概括

名稱

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());}}}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.