亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java設計模式之組合模式(Composite模式)介紹

2019-11-26 15:16:41
字體:
來源:轉載
供稿:網友

Composite定義:將對象以樹形結構組織起來,以達成“部分-整體” 的層次結構,使得客戶端對單個對象和組合對象的使用具有一致性。

Composite比較容易理解,想到Composite就應該想到樹形結構圖。組合體內這些對象都有共同接口,當組合體一個對象的方法被調用執行時,Composite將遍歷(Iterator)整個樹形結構,尋找同樣包含這個方法的對象并實現調用執行??梢杂脿恳粍影賮硇稳荨?/p>

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

Composite好處:

1.使客戶端調用簡單,客戶端可以一致的使用組合結構或其中單個對象,用戶就不必關系自己處理的是單個對象還是整個組合結構,這就簡化了客戶端代碼。
2.更容易在組合體內加入對象部件??蛻舳瞬槐匾驗榧尤肓诵碌膶ο蟛考拇a。

如何使用Composite

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

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

復制代碼 代碼如下:

public abstract class Equipment{
 private String name;
 //網絡價格
 public abstract double netPrice();
 //折扣價格
 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定義,代表著組合體類的對象們,Equipment中定義幾個共同的方法。

復制代碼 代碼如下:

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

Disk是組合體內的一個對象,或稱一個部件,這個部件是個單獨元素( Primitive)。

還有一種可能是,一個部件也是一個組合體,就是說這個部件下面還有'兒子',這是樹形結構中通常的情況,應該比較容易理解?,F在我們先要定義這個組合體:

復制代碼 代碼如下:

abstract class CompositeEquipment extends Equipment{
 private int i=0;
 //定義一個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;
 }
 //注意這里,這里就提供用于訪問自己組合體內的部件方法。
 //上面dIsk 之所以沒有,是因為Disk是個單獨(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,同時為自己里面的對象們提供了外部訪問的方法,重載了Iterator,Iterator是Java的Collection的一個接口,是Iterator模式的實現。

我們再看看CompositeEquipment的兩個具體類:盤盒Chassis和箱子Cabinet,箱子里面可以放很多東西,如底板,電源盒,硬盤盒等;盤盒里面可以放一些小設備,如硬盤 軟驅等。無疑這兩個都是屬于組合體性質的。

復制代碼 代碼如下:

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

至此我們完成了整個Composite模式的架構。

我們可以看看客戶端調用Composote代碼:

復制代碼 代碼如下:

Cabinet cabinet=new Cabinet("Tower");

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

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

上面調用的方法netPrice()或discountPrice(),實際上Composite使用Iterator遍歷了整個樹形結構,尋找同樣包含這個方法的對象并實現調用執行。

Composite是個很巧妙體現智慧的模式,在實際應用中,如果碰到樹形結構,我們就可以嘗試是否可以使用這個模式。

以論壇為例,一個版(forum)中有很多帖子(message),這些帖子有原始貼,有對原始貼的回應貼,是個典型的樹形結構,那么當然可以使用Composite模式,那么我們進入Jive中看看,是如何實現的.

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

復制代碼 代碼如下:

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

我們在ForumThread看到如下代碼:
復制代碼 代碼如下:

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

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美在线www| 成人福利在线视频| 欧美日韩亚洲精品一区二区三区| 欧美大片在线看| 久久综合九色九九| 久久激情视频久久| 欧美肥老太性生活视频| 国产成人a亚洲精品| 国产亚洲精品久久久久久牛牛| 两个人的视频www国产精品| 国产a级全部精品| 亚洲国产高清高潮精品美女| 亚洲va欧美va在线观看| 久热在线中文字幕色999舞| 日本一区二区三区四区视频| 美女福利视频一区| 久热99视频在线观看| 亚洲性线免费观看视频成熟| 欧美精品videosex极品1| 美女久久久久久久| 午夜精品一区二区三区在线播放| 亚洲人成电影网站| 成人黄色免费片| 国产97人人超碰caoprom| 欧美一级片久久久久久久| 伊人伊成久久人综合网小说| 午夜精品一区二区三区在线播放| 国产精品视频男人的天堂| 亚洲国产精品资源| 欧美激情综合亚洲一二区| 国产精品久久久一区| 一区三区二区视频| 欧美视频精品一区| 久久视频中文字幕| 日韩av在线免费观看一区| 91久久久久久久久久久久久| 日韩电影视频免费| 日韩视频免费在线观看| 欧美孕妇性xx| 亚洲欧美视频在线| 91av在线看| 久久天堂电影网| 成人国产精品久久久| www.久久久久久.com| 91黑丝高跟在线| 日韩欧美在线视频日韩欧美在线视频| 亚洲国产另类 国产精品国产免费| 日韩欧美国产网站| 亚洲成色999久久网站| 日韩精品视频在线免费观看| 国内精品视频久久| 日韩免费在线观看视频| 91人人爽人人爽人人精88v| 国产精品网红直播| 亚洲wwwav| 亚洲第一网站男人都懂| 欧美一区二区大胆人体摄影专业网站| 亚洲精品小视频在线观看| 日韩亚洲精品视频| 亚洲视频axxx| 欧美性视频网站| 久久久999精品免费| 色七七影院综合| 在线观看欧美日韩国产| 欧美视频一二三| 国产欧美精品xxxx另类| 中文字幕亚洲二区| 一区二区三区四区在线观看视频| 深夜精品寂寞黄网站在线观看| 国产在线精品成人一区二区三区| 亚洲视频999| 亚洲国产精品va在线看黑人动漫| 在线国产精品播放| 91精品国产电影| 欧美日韩不卡合集视频| 一区二区三区久久精品| 久久97精品久久久久久久不卡| 国产精品久久久久影院日本| 国产精品偷伦视频免费观看国产| 国产免费一区二区三区在线观看| 国产91色在线播放| 欧美日韩精品二区| 久久久免费精品| 精品久久久久久久久久久久久久| 精品国产欧美一区二区三区成人| 97在线视频一区| 亚洲欧美日韩图片| 操91在线视频| 国产日产欧美a一级在线| 一区二区三区无码高清视频| 4444欧美成人kkkk| www高清在线视频日韩欧美| 国产国产精品人在线视| 亚洲人精选亚洲人成在线| 欧美成人激情图片网| 国外成人在线直播| 欧美国产在线视频| 成人福利在线视频| 亚洲全黄一级网站| 夜夜嗨av一区二区三区免费区| 啪一啪鲁一鲁2019在线视频| 一区二区三区回区在观看免费视频| 最好看的2019的中文字幕视频| 日本一区二三区好的精华液| 欧美精品在线免费观看| 欧美极品欧美精品欧美视频| 亚洲国产成人av在线| 国产午夜精品视频免费不卡69堂| 欧美激情网站在线观看| 亚洲精品在线观看www| 亚洲国产91精品在线观看| 欧美日韩国产一区二区三区| 97国产精品人人爽人人做| 亚洲第一二三四五区| 久久综合伊人77777尤物| 国产成人精品综合久久久| 国产一区二区三区在线播放免费观看| 日韩欧美a级成人黄色| 国产精品永久在线| 九九精品在线播放| 在线视频一区二区| 欧美亚洲国产成人精品| 亚洲国产古装精品网站| 91tv亚洲精品香蕉国产一区7ujn| 久久精品久久久久久国产 免费| 亚洲视频axxx| 日韩av片永久免费网站| 国产精品国产福利国产秒拍| 亚洲第一av网站| 日本精品久久久久久久| 国产精品影院在线观看| 欧美裸体xxxx极品少妇软件| 亚洲成人免费网站| 91亚洲精品一区二区| 国产日韩综合一区二区性色av| 国产精品入口免费视| 久久露脸国产精品| 98精品国产高清在线xxxx天堂| 成人免费大片黄在线播放| 欧美成aaa人片在线观看蜜臀| 裸体女人亚洲精品一区| 91中文字幕在线| 欧美日韩国产精品一区二区不卡中文| 国产精品∨欧美精品v日韩精品| 亚洲天堂视频在线观看| 亚洲人成在线观看网站高清| 一区二区欧美日韩视频| 97国产精品免费视频| 国产精品视频精品| 欧美美女18p| 亚洲精品wwwww| 少妇久久久久久| 国产精品国语对白| 亚洲精品综合久久中文字幕| 久久久久亚洲精品国产| 日韩女优人人人人射在线视频| 91久久精品一区| 中文字幕欧美日韩精品| 欧美成人激情视频免费观看| 欧美日韩中文字幕综合视频| 动漫精品一区二区| 中文字幕亚洲二区| 亚洲男人的天堂网站| 日韩性生活视频|