日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java设计模式(8)组合模式(Composite模式)

發布時間:2023/12/9 java 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java设计模式(8)组合模式(Composite模式) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

Composite比較容易理解,想到Composite就應該想到樹形結構圖。組合體內這些對象都有共同接口,當組合體一個對象的方法被調用執行時,Composite將遍歷(Iterator)整個樹形結構,尋找同樣包含這個方法的對象并實現調用執行。可以用牽一動百來形容。

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

Composite好處:

  • 使客戶端調用簡單,客戶端可以一致的使用組合結構或其中單個對象,用戶就不必關系自己處理的是單個對象還是整個組合結構,這就簡化了客戶端代碼。
  • 更容易在組合體內加入對象部件。客戶端不必因為加入了新的對象部件而更改代碼。

如何使用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網絡價格為1public double netPrice() { return 1.; }//定義了disk折扣價格是0.5 對折。public double discountPrice() { return .5; } }

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


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

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++);elsethrow 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源代碼,你肯定無法看懂。

系列文章:

Java設計模式(1)工廠模式(Factory模式)

Java設計模式(2)單態模式(Singleton模式)

Java設計模式(3)建造者模式(Builder模式)

Java設計模式(4)原型模式(Prototype模式)

Java設計模式(5)共享模式/享元模式(Flyweight模式)

Java設計模式(6)橋模式(Bridge模式)

Java設計模式(7)裝飾模式(Decorator模式)

Java設計模式(8)組合模式(Composite模式)

Java設計模式(9)適配器模式(Adapter模式)

Java設計模式(10)代理模式(Proxy模式)

Java設計模式(11)外觀模式(Facade模式)

Java設計模式(12)迭代模式(Iterator模式)

Java設計模式(13)模板模式(Template模式)

Java設計模式(14)責任鏈模式(Chain of Responsibility模式)

Java設計模式(15)備忘錄模式(Memento模式)

Java設計模式(16)中介模式(Mediator模式)

Java設計模式(17)解釋器模式(Interpreter模式)

Java設計模式(18)策略模式(Strategy模式)

Java設計模式(19)狀態模式(State模式)

Java設計模式(20)觀察者模式(Observer模式)

Java設計模式(21)訪問模式(Visitor者模式)

Java設計模式(22)命令模式(Command模式)

轉載于:https://www.cnblogs.com/Coda/p/4296397.html

總結

以上是生活随笔為你收集整理的Java设计模式(8)组合模式(Composite模式)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。