欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java設(shè)計(jì)模式之組合模式(Composite模式)介紹

 更新時(shí)間:2015年03月11日 10:05:38   投稿:junjie  
這篇文章主要介紹了Java設(shè)計(jì)模式之組合模式(Composite模式)介紹,Composite定義:將對(duì)象以樹形結(jié)構(gòu)組織起來,以達(dá)成“部分-整體” 的層次結(jié)構(gòu),使得客戶端對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性,需要的朋友可以參考下

Composite定義:將對(duì)象以樹形結(jié)構(gòu)組織起來,以達(dá)成“部分-整體” 的層次結(jié)構(gòu),使得客戶端對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。

Composite比較容易理解,想到Composite就應(yīng)該想到樹形結(jié)構(gòu)圖。組合體內(nèi)這些對(duì)象都有共同接口,當(dāng)組合體一個(gè)對(duì)象的方法被調(diào)用執(zhí)行時(shí),Composite將遍歷(Iterator)整個(gè)樹形結(jié)構(gòu),尋找同樣包含這個(gè)方法的對(duì)象并實(shí)現(xiàn)調(diào)用執(zhí)行??梢杂脿恳粍?dòng)百來形容。

所以Composite模式使用到Iterator模式,和Chain of Responsibility模式類似。

Composite好處:

1.使客戶端調(diào)用簡(jiǎn)單,客戶端可以一致的使用組合結(jié)構(gòu)或其中單個(gè)對(duì)象,用戶就不必關(guān)系自己處理的是單個(gè)對(duì)象還是整個(gè)組合結(jié)構(gòu),這就簡(jiǎn)化了客戶端代碼。
2.更容易在組合體內(nèi)加入對(duì)象部件??蛻舳瞬槐匾?yàn)榧尤肓诵碌膶?duì)象部件而更改代碼。

如何使用Composite

首先定義一個(gè)接口或抽象類,這是設(shè)計(jì)模式通用方式了,其他設(shè)計(jì)模式對(duì)接口內(nèi)部定義限制不多,Composite卻有個(gè)規(guī)定,那就是要在接口內(nèi)部定義一個(gè)用于訪問和管理Composite組合體的對(duì)象們(或稱部件Component)。

下面的代碼是以抽象類定義,一般盡量用接口interface。

復(fù)制代碼 代碼如下:

public abstract class Equipment{
 private String name;
 //網(wǎng)絡(luò)價(jià)格
 public abstract double netPrice();
 //折扣價(jià)格
 public abstract double discountPrice();
 //增加部件方法  
 public boolean add(Equipment equipment) { return false; }
 //刪除部件方法
 public boolean remove(Equipment equipment) { return false; }
 //注意這里,這里就提供一種用于訪問組合體類的部件方法。
 public Iterator iter() { return null; }
 public Equipment(final String name) { this.name=name; }
}

抽象類Equipment就是Component定義,代表著組合體類的對(duì)象們,Equipment中定義幾個(gè)共同的方法。

復(fù)制代碼 代碼如下:

public class Disk extends Equipment{
 public Disk(String name) { super(name); }
 //定義Disk網(wǎng)絡(luò)價(jià)格為1
 public double netPrice() { return 1.; }
 //定義了disk折扣價(jià)格是0.5 對(duì)折。
 public double discountPrice() { return .5; }
}

Disk是組合體內(nèi)的一個(gè)對(duì)象,或稱一個(gè)部件,這個(gè)部件是個(gè)單獨(dú)元素( Primitive)。

還有一種可能是,一個(gè)部件也是一個(gè)組合體,就是說這個(gè)部件下面還有'兒子',這是樹形結(jié)構(gòu)中通常的情況,應(yīng)該比較容易理解?,F(xiàn)在我們先要定義這個(gè)組合體:

復(fù)制代碼 代碼如下:

abstract class CompositeEquipment extends Equipment{
 private int i=0;
 //定義一個(gè)Vector 用來存放'兒子'
 private Lsit equipment=new ArrayList();
 public CompositeEquipment(String name) { super(name); }
 public boolean add(Equipment equipment) {
  this.equipment.add(equipment);
  return true;
 }
 public double netPrice(){
  double netPrice=0.;
  Iterator iter=equipment.iterator();
  for(iter.hasNext())
   netPrice+=((Equipment)iter.next()).netPrice();
  return netPrice;
 }
 public double discountPrice(){
  double discountPrice=0.;
  Iterator iter=equipment.iterator();
  for(iter.hasNext())
   discountPrice+=((Equipment)iter.next()).discountPrice();
  return discountPrice;
 }
 //注意這里,這里就提供用于訪問自己組合體內(nèi)的部件方法。
 //上面dIsk 之所以沒有,是因?yàn)镈isk是個(gè)單獨(dú)(Primitive)的元素.
 public Iterator iter(){
  return equipment.iterator() ;
    }
    //重載Iterator方法
 public boolean hasNext() { return i<equipment.size(); }
 //重載Iterator方法
 public Object next(){
  if(hasNext())
   return equipment.elementAt(i++);
  else
     throw new NoSuchElementException();
 }
}

上面CompositeEquipment繼承了Equipment,同時(shí)為自己里面的對(duì)象們提供了外部訪問的方法,重載了Iterator,Iterator是Java的Collection的一個(gè)接口,是Iterator模式的實(shí)現(xiàn)。

我們?cè)倏纯碈ompositeEquipment的兩個(gè)具體類:盤盒Chassis和箱子Cabinet,箱子里面可以放很多東西,如底板,電源盒,硬盤盒等;盤盒里面可以放一些小設(shè)備,如硬盤 軟驅(qū)等。無疑這兩個(gè)都是屬于組合體性質(zhì)的。

復(fù)制代碼 代碼如下:

public class Chassis extends CompositeEquipment{
 public Chassis(String name) { super(name); }
 public double netPrice() { return 1.+super.netPrice(); }
 public double discountPrice() { return .5+super.discountPrice(); }
}

public class Cabinet extends CompositeEquipment{
 public Cabinet(String name) { super(name); }
 public double netPrice() { return 1.+super.netPrice(); }
 public double discountPrice() { return .5+super.discountPrice(); }
}

至此我們完成了整個(gè)Composite模式的架構(gòu)。

我們可以看看客戶端調(diào)用Composote代碼:

復(fù)制代碼 代碼如下:

Cabinet cabinet=new Cabinet("Tower");

Chassis chassis=new Chassis("PC Chassis");
//將PC Chassis裝到Tower中 (將盤盒裝到箱子里)
cabinet.add(chassis);
//將一個(gè)10GB的硬盤裝到 PC Chassis (將硬盤裝到盤盒里)
chassis.add(new Disk("10 GB"));

//調(diào)用 netPrice()方法;
System.out.println("netPrice="+cabinet.netPrice());
System.out.println("discountPrice="+cabinet.discountPrice());

上面調(diào)用的方法netPrice()或discountPrice(),實(shí)際上Composite使用Iterator遍歷了整個(gè)樹形結(jié)構(gòu),尋找同樣包含這個(gè)方法的對(duì)象并實(shí)現(xiàn)調(diào)用執(zhí)行。

Composite是個(gè)很巧妙體現(xiàn)智慧的模式,在實(shí)際應(yīng)用中,如果碰到樹形結(jié)構(gòu),我們就可以嘗試是否可以使用這個(gè)模式。

以論壇為例,一個(gè)版(forum)中有很多帖子(message),這些帖子有原始貼,有對(duì)原始貼的回應(yīng)貼,是個(gè)典型的樹形結(jié)構(gòu),那么當(dāng)然可以使用Composite模式,那么我們進(jìn)入Jive中看看,是如何實(shí)現(xiàn)的.

Jive解剖
在Jive中 ForumThread是ForumMessages的容器container(組合體)。也就是說,F(xiàn)orumThread類似我們上例中的 CompositeEquipment.它和messages的關(guān)系如下所示:

復(fù)制代碼 代碼如下:

[thread]
   |- [message]
   |- [message]
      |- [message]
      |- [message]
         |- [message]

我們?cè)贔orumThread看到如下代碼:
復(fù)制代碼 代碼如下:

public interface ForumThread {
 ....
 public void addMessage(ForumMessage parentMessage, ForumMessage newMessage)
   throws UnauthorizedException;
 public void deleteMessage(ForumMessage message)
   throws UnauthorizedException;
 public Iterator messages();
 ....
}

類似CompositeEquipment,提供用于訪問自己組合體內(nèi)的部件方法:增加、刪除、遍歷。

結(jié)合我的其他模式中對(duì)Jive的分析,我們已經(jīng)基本大體理解了Jive論壇體系的框架,如果你之前不理解設(shè)計(jì)模式,而直接去看Jive源代碼,你肯定無法看懂。

相關(guān)文章

  • AndroidHttpClient使用Cookie應(yīng)用分析

    AndroidHttpClient使用Cookie應(yīng)用分析

    今天想把一個(gè)用使用了HttpClient的自動(dòng)簽到小程序移植到Android上,還好Android的SDK自帶了HttpClient的包.當(dāng)然也可以繼續(xù)使用DefaultHttpClient,但用為Android定制的AndroidHttpClient自然更好
    2012-11-11
  • Mybatis入門教程(四)之mybatis動(dòng)態(tài)sql

    Mybatis入門教程(四)之mybatis動(dòng)態(tài)sql

    這篇文章主要介紹了Mybatis入門教程(四)之mybatis動(dòng)態(tài)sql的相關(guān)資料,涉及到動(dòng)態(tài)sql及動(dòng)態(tài)sql的作用知識(shí),本文介紹的非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-09-09
  • 百度Java面試題 前200頁精選(中)

    百度Java面試題 前200頁精選(中)

    這篇文章主要為大家分享了Java面試資源中篇,百度“Java面試題”前200頁都在這里了,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • 淺談SpringBoot 中關(guān)于自定義異常處理的套路

    淺談SpringBoot 中關(guān)于自定義異常處理的套路

    這篇文章主要介紹了淺談SpringBoot 中關(guān)于自定義異常處理的套路,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • SpringBoot中controller深層詳細(xì)講解

    SpringBoot中controller深層詳細(xì)講解

    這篇文章主要介紹了SpringBoot在Controller層接收參數(shù)的常用方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-02-02
  • java打印菱形及直角和等腰三角形的方法

    java打印菱形及直角和等腰三角形的方法

    用Java輸出菱形本身是一個(gè)比較簡(jiǎn)單的問題,這是Java初學(xué)者都要編寫的一個(gè)算法,下面這篇文章主要給大家介紹了關(guān)于java打印菱形及直角和等腰三角形的方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • IDEA 2019.1.3 激活碼大全

    IDEA 2019.1.3 激活碼大全

    本文是小編給大家收藏整理的IDEA 2019.1.3 激活碼大全,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2019-10-10
  • 使用idea遠(yuǎn)程調(diào)試jar包的配置過程

    使用idea遠(yuǎn)程調(diào)試jar包的配置過程

    這篇文章主要介紹了使用idea遠(yuǎn)程調(diào)試jar包的配置過程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • Java泛型T,E,K,V,N,?與Object區(qū)別和含義

    Java泛型T,E,K,V,N,?與Object區(qū)別和含義

    Java?泛型(generics)是?JDK?5?中引入的一個(gè)新特性,?泛型提供了編譯時(shí)類型安全檢測(cè)機(jī)制,該機(jī)制允許程序員在編譯時(shí)檢測(cè)到非法的類型。本文將詳細(xì)講講Java泛型T、E、K、V、N、?和Object區(qū)別和含義,需要發(fā)可以參考一下
    2022-03-03
  • Java求兩個(gè)正整數(shù)的最大公約數(shù)和最小公倍數(shù)

    Java求兩個(gè)正整數(shù)的最大公約數(shù)和最小公倍數(shù)

    這篇文章主要介紹了輸入兩個(gè)正整數(shù)m和n,求其最大公約數(shù)和最小公倍數(shù),需要的朋友可以參考下
    2017-02-02

最新評(píng)論