偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

深度解析設計模式之組合模式

開發(fā) 前端
組合模式(Composite Pattern),又叫部分整體模式,依據(jù)樹形結構來組合對象,用來表示部分以及整體層次。

[[424219]]

一、介紹

組合模式(Composite Pattern),又叫部分整體模式,依據(jù)樹形結構來組合對象,用來表示部分以及整體層次。

組合模式 一般用來描述整體與部分的關系,它將對象組織到樹形結構中,最頂層的節(jié)點稱為根節(jié)點,根節(jié)點下面可以包含樹枝節(jié)點和葉子節(jié)點,樹枝節(jié)點下面又可以包含樹枝節(jié)點和葉子節(jié)點。如下圖所示:

在組合模式中,會把樹枝節(jié)點和葉子節(jié)點認為是同一種數(shù)據(jù)類型(用同一接口定義),讓它們具備一致行為。

這樣,整個樹形結構中的對象都是同一種類型,帶來的一個好處就是客戶無需辨別 樹枝節(jié)點還是葉子節(jié)點,而是可以直接進行操作,給客戶使用帶來極大的便利。

從設計的角度看,組合模式涉及到三個角色:

抽象根節(jié)點:它是一個抽象接口,定義了算法;

具體節(jié)點:實現(xiàn)或繼承自抽象根節(jié)點,完成具體算法操作;

客戶端:客戶類提出使用具體類的請求;

二、示例

下面,我們拿學校的組織架構為例,比如說一個學校,包含了后勤部、網絡部、教學部、保衛(wèi)部、分校等部門組成,每一個分校,同樣具有后勤部、網絡部這些。既然這些部門都是學校的部門,基本的操作應該都是一樣的,我們可以將所有的部門都拉入學校屬性。

用類圖表示如下:

實現(xiàn)過程如下!

  1. /** 
  2.  * 學校接口 
  3.  */ 
  4. public interface School { 
  5.  
  6.     /** 
  7.      * 添加分?;蛘卟块T 
  8.      * @param school 
  9.      */ 
  10.     void addPart(School school); 
  11.  
  12.     /** 
  13.      * 移除分?;蛘卟块T 
  14.      * @param school 
  15.      */ 
  16.     void removePart(School school); 
  17.  
  18.     /** 
  19.      * 展示分?;蛘卟块T信息 
  20.      */ 
  21.     void displayPart(); 

然后,創(chuàng)建一個學校具體實現(xiàn)類ConcreteSchool,可以是總校,也可以是分校,如下:

  1. /** 
  2.  * 具體學校,可以是總校,也可以是分校 
  3.  */ 
  4. public class ConcreteSchool implements School { 
  5.  
  6.     private String name;//名稱 
  7.  
  8.     private List<School> partList = new ArrayList<>(); 
  9.  
  10.     public ConcreteSchool(String name) { 
  11.         this.name = name
  12.     } 
  13.  
  14.     @Override 
  15.     public void addPart(School school) { 
  16.         partList.add(school); 
  17.     } 
  18.  
  19.     @Override 
  20.     public void removePart(School school) { 
  21.         partList.remove(school); 
  22.     } 
  23.  
  24.     /** 
  25.      * 學校查看部門信息 
  26.      */ 
  27.     @Override 
  28.     public void displayPart() { 
  29.         for (School school : partList) { 
  30.             school.displayPart(); 
  31.         } 
  32.  
  33.     } 

接著,創(chuàng)建兩個具體的部門,網絡部門InternetDepartment、安全部門SecurityDepartment,代碼如下:

  1. /** 
  2.  * 網絡部門 
  3.  */ 
  4. public class InternetDepartment implements School { 
  5.  
  6.     private String name;//名稱 
  7.  
  8.     public InternetDepartment(String name) { 
  9.         this.name = name
  10.     } 
  11.  
  12.     @Override 
  13.     public void addPart(School school) {} 
  14.  
  15.     @Override 
  16.     public void removePart(School school) {} 
  17.  
  18.     @Override 
  19.     public void displayPart() { 
  20.         System.out.println("我是" + name + ",負責學校的網絡管理"); 
  21.     } 
  1. /** 
  2.  * 安全部門 
  3.  */ 
  4. public class SecurityDepartment implements School { 
  5.  
  6.     private String name;//名稱 
  7.  
  8.     public SecurityDepartment(String name) { 
  9.         this.name = name
  10.     } 
  11.  
  12.     @Override 
  13.     public void addPart(School school) {} 
  14.  
  15.     @Override 
  16.     public void removePart(School school) {} 
  17.  
  18.     @Override 
  19.     public void displayPart() { 
  20.         System.out.println("我是" + name + ",負責學校的安全工作"); 
  21.     } 

最后,編寫一個測試類,如下:

  1. public class CompositeClient { 
  2.  
  3.     public static void main(String[] args) { 
  4.         //總校部門 
  5.         ConcreteSchool rootSchool = new ConcreteSchool("總校"); 
  6.         rootSchool.addPart(new InternetDepartment("總校網絡部門")); 
  7.         rootSchool.addPart(new SecurityDepartment("總校安全部門")); 
  8.  
  9.         //分校部門 
  10.         ConcreteSchool branchSchool = new ConcreteSchool("分校"); 
  11.         branchSchool.addPart(new InternetDepartment("分校網絡部門")); 
  12.         branchSchool.addPart(new SecurityDepartment("分校安全部門")); 
  13.  
  14.         rootSchool.addPart(branchSchool); 
  15.         rootSchool.displayPart();//展示信息 
  16.     } 

輸出結果:

  1. 我是總校網絡部門,負責學校的網絡管理 
  2. 我是總校安全部門,負責學校的安全工作 
  3. 我是分校網絡部門,負責學校的網絡管理 
  4. 我是分校安全部門,負責學校的安全工作 

從上面的例子,可以很清晰看到類的層次關系,所有的具體對象當作一個單一的對象School來處理。

三、應用

在 Java 的 GUI 容器組件中,就用到了組合模式,所有的子類組件,都可以看作為容器對象。

當然,還有我們使用的 Mybatis 在處理動態(tài) SQL 節(jié)點時,也應用到了組合設計模式,Mybatis 會將映射配置文件中定義的動態(tài) SQL 節(jié)點、文本節(jié)點等解析成對應的 SqlNode 實現(xiàn),并形成樹形結構。

四、總結

當想表達對象的部分-整體的層次結構時,推薦采用組合模式進行設計。

五、參考

1、java的架構師技術棧 - 23種設計模式之組合模式

2、菜鳥教程 -組合模式

 

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2012-04-12 09:38:21

JavaScript

2013-11-26 15:48:53

Android設計模式SDK

2020-08-21 07:23:50

工廠模式設計

2012-02-29 09:41:14

JavaScript

2021-06-09 08:53:34

設計模式策略模式工廠模式

2015-09-08 13:39:10

JavaScript設計模式

2021-06-16 08:56:06

模版方法模式設計模式行為型設計模式

2012-01-13 15:59:07

2021-06-29 08:54:23

設計模式代理模式遠程代理

2021-12-24 07:50:45

責任鏈模式設計

2023-09-04 13:14:00

裝飾器設計模式

2010-03-25 08:52:30

PHP設計模式代理模式

2010-04-19 09:30:00

工廠模式PHP設計模式

2020-12-01 07:16:05

重學設計模式

2016-03-28 10:23:11

Android設計單例

2021-03-05 07:57:41

設計模式橋接

2012-07-11 08:51:51

設計模式

2021-01-21 05:34:14

設計模式建造者

2021-06-22 15:27:13

設計模式迭代器模式Java

2022-03-25 11:01:28

Golang裝飾模式Go 語言
點贊
收藏

51CTO技術棧公眾號