日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

什么是組合模式

“組合模式”也被稱為“部分整體模式”該模式屬于結(jié)構(gòu)型模式的一種。

講解該模式之前先帶大家熟悉一下“樹形結(jié)構(gòu)”。相信大家對“樹形結(jié)構(gòu)”不會(huì)太陌生,如果你剛好不太了解的話可以想一下大樹,一顆樹它分別有樹根、樹枝、樹葉,正好樹形結(jié)構(gòu)中也有根節(jié)點(diǎn)、子節(jié)點(diǎn)(非葉子節(jié)點(diǎn))、葉子節(jié)點(diǎn)。

程序員必備技能:設(shè)計(jì)模式之——組合模式

 

組合模式就運(yùn)用了樹形結(jié)構(gòu),該模式的核心思想是:將多個(gè)對象組合成樹形結(jié)構(gòu),以此結(jié)構(gòu)來表示“整體-部分”之間的層次關(guān)系。

組合模式UML類圖

 

程序員必備技能:設(shè)計(jì)模式之——組合模式

 

UML類圖講解:

1、Component:組合模式中的“根節(jié)點(diǎn)”,可以是接口、抽象類、普通類,該類中定義了其子類的所有共性內(nèi)容,并且該類中還存在著用于訪問和管理它子部件的方法。
2、Leaf:組合中的葉子節(jié)點(diǎn),也就是最末端的節(jié)點(diǎn),該節(jié)點(diǎn)下不會(huì)再有子節(jié)點(diǎn)。
3、Composite:非葉子節(jié)點(diǎn),它的作用是存儲子部件,并且在Composite中實(shí)現(xiàn)了對子部件的相關(guān)操作。

通過案例了解組合模式

案例:某公司老板需要開發(fā)一個(gè)人員和部門管理系統(tǒng),要求是可以靈活的新增、刪除、展示部門以及部門下的員工。此時(shí)我們就可以通過組合模式來實(shí)現(xiàn)。

組織構(gòu)成 => 對應(yīng)Component角色

public abstract class OrganizationComponent {
  // 名稱
  private String name;
  // 描述
  private String describe;
  /**
   * 顯示方法
   * 該方法不論是子節(jié)點(diǎn)還是葉子節(jié)點(diǎn)都需要,所以將其設(shè)計(jì)成抽象方法讓子類自行實(shí)現(xiàn)。
   */
  public abstract void show();
  /**
   * 新增方法
   * 因?yàn)槿~子節(jié)點(diǎn)不需要該方法,所以將該方法寫成一個(gè)空實(shí)現(xiàn)方法,這樣葉子節(jié)點(diǎn)繼承該類時(shí)就不會(huì)被迫實(shí)現(xiàn)不需要的方法了。
   */
  public void add(OrganizationComponent component) {
    throw new UnsupportedOperationException();
  }
  /**
   * 刪除方法
   * 同add()方法一樣設(shè)計(jì)為空實(shí)現(xiàn)。
   */
  public void remove(OrganizationComponent component) {
    throw new UnsupportedOperationException();
  }
 ... get()、set()、有參構(gòu)造方法
}

公司 => 對應(yīng)Composite角色

public class Company extends OrganizationComponent {
  // components的作用就是,管理公司下的部門,也就是公司下的子節(jié)點(diǎn)。
  private List<OrganizationComponent> components = new ArrayList<>();
  ... 有參構(gòu)造方法
  /**
   * 重寫添加方法
   */
  @Override
  public void add(OrganizationComponent component) {
    this.components.add(component);
  }
  /**
   * 重寫刪除方法
   */
  @Override
  public void remove(OrganizationComponent component) {
    this.components.remove(component);
  }
  /**
   * 實(shí)現(xiàn)顯示方法
   */
  @Override
  public void show() {
    // 打印公司名稱
    System.out.println("======" + "名稱:" + this.getName() + " 描述:" + this.getDescribe() + "======");
    // 打印公司下的子節(jié)點(diǎn)
    for (OrganizationComponent component : components) {
      component.show();
    }
  }
}

部門 => 對應(yīng)Composite角色

public class Department extends OrganizationComponent {
  // components的作用就是,管理部門下的員工,也就是部門下的子節(jié)點(diǎn)。
  private List<OrganizationComponent> components = new ArrayList<>();
  ... 有參構(gòu)造方法
  /**
   * 重寫添加方法
   */
  @Override
  public void add(OrganizationComponent component) {
    this.components.add(component);
  }
  /**
   * 重寫刪除方法
   */
  @Override
  public void remove(OrganizationComponent component) {
    this.components.remove(component);
  }
  /**
   * 實(shí)現(xiàn)顯示方法
   */
  @Override
  public void show() {
    // 打印部門名稱
    System.out.println("======" + "名稱:" + this.getName() + " 描述:" + this.getDescribe() + "======");
    // 打印部門下的子節(jié)點(diǎn)
    for (OrganizationComponent component : components) {
      component.show();
    }
  }
}

員工 => 對應(yīng)的是Leaf角色

public class Workers extends OrganizationComponent {
  ... 有參構(gòu)造方法  /**
   * 實(shí)現(xiàn)顯示方法
   */
  @Override
  public void show() {
    System.out.println("名稱:" + this.getName() + " 描述:" + this.getDescribe());
  }}

客戶端測試類

public class Client {
  public static void main(String[] args) {    // 公司    OrganizationComponent company = new Company("小菜鳥公司", "從不加加班的公司");
    // 部門    OrganizationComponent department = new Department("研發(fā)部", "一個(gè)神奇的部門");
    // 公司下添加部門    company.add(department);    // 員工    department.add(new Workers("大牛", "上班摸摸魚"));
    department.add(new Workers("小菜鳥一號", "天天CRUD"));
    // 輸出    company.show();  }}

執(zhí)行結(jié)果

圖片:執(zhí)行結(jié)果圖

總結(jié)

1、使用組合模式可以讓用戶可以使用統(tǒng)一的方式處理整個(gè)樹形結(jié)構(gòu)的個(gè)別對象和組合對象,從而簡化客戶端的操作。

2、組合模式具有較強(qiáng)的擴(kuò)展性,當(dāng)我們想要更改組合對象時(shí),只需要調(diào)整內(nèi)部的層次關(guān)系即可,客戶端不需要作出任何改動(dòng)。

3、客戶端不用考慮組合中的細(xì)節(jié),通過添加節(jié)點(diǎn)和葉子就可以創(chuàng)建出復(fù)雜的樹形結(jié)構(gòu)。

4、當(dāng)需要處理的對象是樹形結(jié)構(gòu)時(shí)可以考慮使用組合模式。

5、節(jié)點(diǎn)和葉子節(jié)點(diǎn)存在很大差異的情況下不建議使用組合模式。

今天的分享就到這里了,如果感覺“菜鳥”寫的文章還不錯(cuò),記得點(diǎn)贊加關(guān)注呦!你們的支持就是我堅(jiān)持下去的動(dòng)力。文章哪里寫的有問題的也希望大家可以指出,我會(huì)虛心受教。

分享到:
標(biāo)簽:模式 設(shè)計(jì)
用戶無頭像

網(wǎng)友整理

注冊時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定