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

首頁 > 學院 > 開發設計 > 正文

java設計模式之Composite(組合)

2019-11-18 11:14:25
字體:
來源:轉載
供稿:網友

  Composite定義:
  將對象以樹形結構組織起來,以達成“部分-整體” 的層次結構,使得客戶端對單個對象和組合對象的使用具有一致性.
  
  Composite比較輕易理解,想到Composite就應該想到樹形結構圖。組合體內這些對象都有共同接口,當組合體一個對象的方法被調用執行時,Composite將遍歷(Iterator)整個樹形結構,尋找同樣包含這個方法的對象并實現調用執行??梢杂脿恳粍影賮硇稳荨?br />  
  所以Composite模式使用到Iterator模式,和Chain of Responsibility模式類似。
  
  Composite好處:
  1.使客戶端調用簡單,客戶端可以一致的使用組合結構或其中單個對象,用戶就不必關系自己處理的是單個對象還是整個組合結構,這就簡化了客戶端代碼。
  2.更輕易在組合體內加入對象部件. 客戶端不必因為加入了新的對象部件而更改代碼。
  
  如何使用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, 提供用于訪問自己組合體內的部件方法: 增加 刪除 遍歷.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美电影免费观看高清完整| 一区二区三区无码高清视频| 欧美在线xxx| 亚洲精品成人久久电影| 中文字幕欧美日韩在线| 亚洲国产欧美一区二区三区久久| 欧美精品在线极品| 国产精品久久久久一区二区| 亚洲欧美制服中文字幕| 亚洲精品久久久久国产| 国产精品久久久亚洲| 日韩精品视频在线播放| 在线播放国产一区二区三区| 91精品视频播放| 国产精品久久久亚洲| 97国产真实伦对白精彩视频8| 69国产精品成人在线播放| 国产在线一区二区三区| 日韩黄色在线免费观看| 欧美性猛交xxxx免费看久久久| 中文字幕日韩电影| 久久人人97超碰精品888| 欧美视频在线视频| 国产aⅴ夜夜欢一区二区三区| 国产一区欧美二区三区| 综合av色偷偷网| 日韩精品在线观看一区二区| 国产精品私拍pans大尺度在线| 亚洲午夜激情免费视频| 精品人伦一区二区三区蜜桃网站| 久热精品视频在线| 日韩免费av在线| 欧美性黄网官网| 精品国产视频在线| 欧美视频精品一区| 久久久久久网站| 欧美亚洲日本黄色| 日本sm极度另类视频| 日韩电影在线观看中文字幕| 久久影院免费观看| 色偷偷91综合久久噜噜| 欧美日韩一区二区在线| 久久天堂av综合合色| 国产第一区电影| 九九精品视频在线| 亚洲国产成人精品久久久国产成人一区| 国产欧美精品一区二区| 久久在线精品视频| 亚洲男人天堂九九视频| 国产精品国产福利国产秒拍| 大桥未久av一区二区三区| 欧美国产日本高清在线| 国产亚洲免费的视频看| 日韩欧美在线视频日韩欧美在线视频| 国产va免费精品高清在线观看| 亚洲人成网站999久久久综合| 中文字幕日韩av| 最近2019中文字幕一页二页| 亚洲人午夜精品| 91tv亚洲精品香蕉国产一区7ujn| 国产精品第一第二| 国产午夜精品麻豆| 亚洲国产精久久久久久久| 国产伦精品免费视频| 亚洲一区二区久久| 欧美日本高清一区| 91国偷自产一区二区三区的观看方式| 欧美黄色成人网| 久久视频免费在线播放| 欧美视频在线免费| 91精品综合久久久久久五月天| 亚洲毛茸茸少妇高潮呻吟| 久久青草精品视频免费观看| 国模gogo一区二区大胆私拍| 国产成人精品综合| 欧美在线激情视频| 亚洲国产成人久久| 九九热最新视频//这里只有精品| 97视频在线观看免费高清完整版在线观看| 亚洲国产精品va在线看黑人动漫| 亚洲国产另类 国产精品国产免费| 久久精品成人一区二区三区| 亚洲精品日韩久久久| 狠狠操狠狠色综合网| 亚洲国产日韩欧美在线动漫| 青青草一区二区| 亚洲人成电影网站色| 黑人巨大精品欧美一区二区| 亚洲综合中文字幕68页| 日韩视频免费在线| 国产精品久久久久999| 欧美午夜片在线免费观看| 久久久久久午夜| 国产精品天天狠天天看| 欧美视频中文在线看| 色哟哟入口国产精品| 欧美中文在线观看国产| 91av在线播放视频| 国产精品永久免费观看| 亚洲欧洲高清在线| 欧美性生活大片免费观看网址| 国产欧美日韩精品在线观看| 欧美老妇交乱视频| 日韩av在线免费| 精品国产乱码久久久久久婷婷| 欧美日韩成人在线观看| 久久亚洲精品国产亚洲老地址| 欧美国产中文字幕| 国产视频久久久| 久久免费在线观看| 91高清视频在线免费观看| 久久影院中文字幕| 国产成人综合精品在线| 亚洲va电影大全| 欧美孕妇与黑人孕交| 亚洲品质视频自拍网| 国产亚洲精品久久久久久牛牛| 欧美在线欧美在线| 欧美视频在线观看免费网址| 欧美日韩免费在线观看| 国产视频自拍一区| 成人欧美一区二区三区黑人孕妇| 日本欧美一二三区| 欧美美女15p| 91成人在线观看国产| 日本老师69xxx| 欧美一级视频免费在线观看| 久久国产精彩视频| 国产精品6699| 成人欧美一区二区三区黑人| 亚洲夜晚福利在线观看| 亚洲电影免费观看高清完整版在线观看| 91国语精品自产拍在线观看性色| 国产精品一区二区三区免费视频| 午夜精品久久久久久久男人的天堂| 亚洲护士老师的毛茸茸最新章节| 久久成年人视频| 久久夜精品香蕉| 丰满岳妇乱一区二区三区| 亚洲美女视频网| 国产自产女人91一区在线观看| 国产精品久久久久久久久| 久久6免费高清热精品| 国产视频在线一区二区| 国外色69视频在线观看| 国产精品久久久久久久天堂| 午夜精品久久久久久久男人的天堂| 久久五月天色综合| 亚洲欧美中文日韩在线| 久久亚洲精品国产亚洲老地址| 国产在线观看91精品一区| 91国语精品自产拍在线观看性色| 日本一区二三区好的精华液| 国内精品久久久久影院优| 久久久久久有精品国产| 久久久久久九九九| 亚洲精品小视频在线观看| 国产精品久久久久久久久久小说| 久久精品视频在线播放| 日韩中文理论片| 亚洲电影免费观看高清完整版在线| 中文字幕日韩av综合精品| 欧美激情在线观看视频| 亚洲精品之草原avav久久|