生活随笔
收集整理的這篇文章主要介紹了
08-合成模式Quarkus实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
摘要:本文用一個實例場景描述Gof 23設計模式中的合成模式,并用Quarkus框架代碼給予實現,同時也給出實現代碼的UML模型。
關鍵字:Gof 23 設計模式 合成模式 Quarkus
1 基礎知識
1.1 標準定義
合成(Composite)模式標準定義:將對象組合成樹形結構以表示“部分-整體”的層次結構。Composite使得用戶對單個對象和組合對象的使用具有一致性。
1.2 分析和說明
合成(Composite)模式屬于結構型設計模式。它將對象組合成樹形結構以表示“整體-部分” 的層次結構,定義了包含基本對象和組合對象的類層次結構,使得用戶對單個對象和組合對象的使用具有一致性。合成模式就是一個處理對象的樹結構的模式。合成模式把部分與整體的關系用樹結構表示出來,使得客戶端把一個個單獨的成分對象和由他們復合而成的合成對象同等看待。
合成(Composite)模式結構如圖1所示。其角色包括抽象構件(Component)角色、樹枝構件(Composite)角色和樹葉構件(Leaf)角色。
圖1 合成模式結構
抽象構件(Component)角色:這是一個抽象角色,它給參加組合的對象定義出公共的接口及其默認行為,可以用來管理所有的子對象。合成對通常把它所包含的子對象當作類型為Component的對象。在安全式的合成模式里,構件角色并不定義出管理子對象的方法,這一定義由樹枝構件對象給出。為用戶操作Leaf類和Composite類提供一致的方法,它主要定義了Operation(),Add(Component),Remove(Component),GetChild(int)幾個方法,其中,Add(Component),Remove(Component),GetChild(int)的責任是對“整體”(Composite類)進行操作;Operation()是“部分”(Leaf類)和“整體”(Composite類)都需要的方法。
樹枝構件(Composite)角色:代表參加組合的有下級子對象的對象。樹枝構件類給出所有的管理子對象的方法,如add()、remove()以及components()的聲明。除擁有Operation()方法外,還有“整體” 類操作的方法, 比如Add(Component),Remove(Component),GetChild(int)。Composite 對象由Composite對象和Leaf對象聚合而成,既可以包含“部分”,也可以包含“整體”。
樹葉構件(Leaf)角色:樹葉對象是沒下級子對象的對象,定義出參加組合的原始對象的行為。它擁有Opertion()方法即可滿足用戶需求的操作。
2 應用場景舉例
比如團隊(組織)是一個總體的抽象類。集團公司、公司、工廠、部門、班組、項目組是一個團隊,都可以繼承團隊。但是團隊本身也是有層次結構的。比如我們要構架一個軟件公司,就要這樣先形成公司,在形成公司下面的部門,接著形成部門下面的項目組。如果構架一個工廠性質的公司,那在形成完公司根節點后開始形成公司下屬的工廠,在工廠下面再形成車間。實現用例圖見圖2所示。
圖2 合成模式用例圖
在這里可以把抽象組織(AbstractOrganization)理解為抽象構件(Component)角色。公司(Corporation)、工廠(Factory)、部門(Department)理解為樹枝構件(Composite)角色,在其下面還有組織。車間(Workshop)和項目組(WorkTeam)理解為樹葉構件(Leaf)角色,在其下面已經沒有組織了。而其結構類圖如圖3所示。公司類(Corporation)、工廠類(Factory)、部門類(Department)、車間類(Workshop)和項目組類(WorkTeam)全部都繼承抽象組織類(AbstractOrganization)。
圖3 合成模式類圖
合成模式實現的順序圖如圖4所示,實現順序描述:①-⑥都是新建對象,分別為Corporation對象、deaprt1對象、deaprt2對象、deaprt3對象、team1對象和team2對象。⑦-⑨是把deaprt1對象、deaprt2對象和deaprt3對象插入到Corporation對象下,作為Corporation對象的下級子對象。⑩-⑩ 是把team1對象和team2對象插入到deaprt1對象下,作為deaprt1對象的下級子對象。
圖4 合成模式實現順序圖
在一個公司組織機構中,公司下面有部門,部門下面有項目組。如果要形成一個公司組織,先創建公司根節點,然后創建公司下屬的部門子節點。有的部門下面還有項目組,接著可以在部門節點下面創建項目組孫節點。
3.Quarkus的實現程序代碼
Quarkus程序實現主要包括AbstractOrganization抽象類文件,Corporation類文件,Department類文件,Factory類文件,Workshop類文件和WorkTeam類文件等6個文件。其關系如圖3所示。下面分別列出這6個文件的程序代碼,最后列出測試代碼并顯示輸出結果。
AbstractOrganization抽象類程序代碼清單01所示。
程序代碼清單01
public abstract class AbstractOrganization { protected String organizationName;protected String organizationType;public AbstractOrganization(String name){organizationName = name;} public void add(AbstractOrganization organization){};public void remove(AbstractOrganization organization){};public void showOrganizationStructure(String parentName){}public String getOrganizationName() {return organizationName;}public void setOrganizationName(String organizationName) {this.organizationName = organizationName;}
}
Corporation具體類,Department具體類和Factory具體類繼承AbstractOrganization抽象類,其程序代碼清單02所示。
程序代碼清單02
@Dependent
public class Corporation extends AbstractOrganization {private List<AbstractOrganization> componentList = new ArrayList<AbstractOrganization>();public Corporation() {this.organizationType = "Corporation";}public void add(AbstractOrganization organization) {componentList.add(organization);}public void showOrganizationStructure(String parentName) {String organizationName = this.getOrganizationName();System.out.println(parentName + organizationName);for (int i = 0; i < componentList.size(); i++) {AbstractOrganization organization = componentList.get(i);organization.showOrganizationStructure(parentName+ organizationName + "——");}}}@Dependent
public class Department extends AbstractOrganization{private List<AbstractOrganization> componentList = new ArrayList<AbstractOrganization>();public Department (String name){ super(name);organizationType = "Department";}public Department (){organizationType = "Department";}public void add(AbstractOrganization organization){componentList.add(organization);}public void showOrganizationStructure(String parentName){String organizationName = this.getOrganizationName();System.out.println(parentName + organizationName); for (int i=0; i<componentList.size(); i++){AbstractOrganization organization = componentList.get(i);organization.showOrganizationStructure(parentName+organizationName+"——");}}
}@Dependent
public class Factory extends AbstractOrganization{private List<AbstractOrganization> componentList = new ArrayList<AbstractOrganization>();public Factory (String name){ super(name);organizationType = "Factory";}public Factory (){ organizationType = "Factory";}public void add(AbstractOrganization organization){componentList.add(organization);}public void showOrganizationStructure(String parentName){String organizationName = this.getOrganizationName();System.out.println(parentName + organizationName); for (int i=0; i<componentList.size(); i++){AbstractOrganization organization = componentList.get(i);organization.showOrganizationStructure(parentName+organizationName+"——");} }
}
Workshop具體類和WorkTeam具體類繼承AbstractOrganization抽象類,其程序代碼清單03所示。
程序代碼清單03
@Dependent
public class Workshop extends AbstractOrganization{public Workshop (String name){ super(name);organizationType = "Workshop";}public Workshop (){ organizationType = "Workshop";}public void add(AbstractOrganization c){System.out.println("這是葉子節點,下面沒有內容");}public void showOrganizationStructure(String parentName){String organizationName = this.getOrganizationName();System.out.println(parentName+ organizationName); }
}@Dependent
public class WorkTeam extends AbstractOrganization{public WorkTeam (String name){ super(name);organizationType = "WorkTeam";}public WorkTeam (){ organizationType = "WorkTeam";}public void add(AbstractOrganization c){System.out.println("這是葉子節點,下面沒有內容");}public void showOrganizationStructure(String parentName){String organizationName = this.getOrganizationName();System.out.println(parentName+ organizationName); }
}
合成模式測試程序的代碼清單04如下:
程序代碼清單04
public class CompositeClient implements QuarkusApplication {@ConfigProperty(name = "gof23.structuralpattern.composite.title", defaultValue = "gof23")String title;@Inject Corporation corporation1;@Inject Department depart1, depart2, depart3;@Inject WorkTeam team1, team2;public void scene1() {// 場景1,形成公司-部門-項目組的公司結構corporation1.addName("公司A");depart1.addName("部門1");depart2.addName("部門2");depart3.addName("部門3");corporation1.add(depart1);corporation1.add(depart2);corporation1.add(depart3); team1.addName("項目組1");team2.addName("項目組2");depart1.add(team1);depart1.add(team2);corporation1.showOrganizationStructure("");}@Inject Corporation corporation2;@Inject Factory factory1, factory2, factory3;@Inject Workshop team3, team4;public void scene2() {// 場景2,形成公司-工廠-車間的工廠結構 corporation2.addName("公司B"); factory1.addName("工廠1");factory2.addName("工廠2");factory3.addName("工廠3");corporation2.add(factory1);corporation2.add(factory2);corporation2.add(factory3);team3.addName("車間1");team4.addName("車間2");factory1.add(team3);factory1.add(team4);corporation2.showOrganizationStructure("");}@Overridepublic int run(String... args) {System.out.println("———————" + title + "演示輸出——————"); scene1();System.out.println();scene2();return 0;}public static void main(String... args) {Quarkus.run(CompositeClient.class, args);}
}
合成模式測試類輸出結果如下所示:
公司A
公司A——部門1
公司A——部門1——項目組1
公司A——部門1——項目組2
公司A——部門2 公司A——部門3
公司A
公司A——工廠1
公司A——工廠1——車間1
公司A——工廠1——車間2
公司A——工廠2
公司A——工廠3
4. 相關Quarkus程序源碼下載
可以直接從github上獲取代碼,讀者可以從github上clone預先準備好的示例代碼。
git clone https://github.com/rengang66/quarkus-sample-gof23.git
這是一個Maven項目,然后Maven導入工程。該程序位于“src\main\java\com\iiit\quarkus\sample\gof23\structuralpattern\composite”目錄中。
同時也可以從gitee上clone預先準備好的示例代碼,命令如下:
git clone https://gitee.com/rengang66/quarkus-sample-gof23.git
參考文獻
[1] E.Gamma, R.Helm, R.Johnson, and Vlissides. Design Patterns Elements of Reusable Object Oriented Software. Addison-Wesley, 1995
[2] E.Gamma, R.Helm, R.Johnson, and Vlissides.著,李英軍等譯,設計模式:可復用面向對象軟件的基礎,北京:機械工業出版社.2000.9.
[3] 閻宏,Java與模式,北京:電子工業出版社. 2002.10
[4] 王俊峰 戚曉濱. 設計模式和UML. 計算機應用研究,1999.16(5), 27-29,39.
[5] 陳琴 朱正強. UML在設計模式描述中的應用. 計算機工程與設計,2003.24(4), 81-84.
[6] 戴建國 郭理 曹傳東. JUnit框架剖析. 計算機與數字工程,2008.36(8), 43-45,135.
[7] 劉兵. JUnit設計模式分析. 程序員,2003.(6), 51-57,60.
[8] 顧穎 徐良賢 賈銀軍. JUnit設計模式分析和應用. 計算機工程,2004.30(B12), 178-179,182.
[9] 吳信永 宋東 劉飛. 基于構件技術的通用ATS框架設計. 計算機測量與控制,2008.16(2), 141-143,155.
[10] 馬維達. ACE與GoF設計模式——ACE_Message_Block與Composite模式. 程序員,2004.(2), 104-105.
[11] 肖計劃 劉海硯 張吉才. 設計模式在地圖制圖軟件開發中的應用. 測繪工程,2008.17(5), 4-7,11.
[12] 李光俊 華慶一 吳海松. 基于AOP技術的Composite模式的改進. 計算機工程,2008.34(10), 73-74,77.
[13] 饒一梅 王治寶. 軟件設計模式及其在Java類庫中的典型實現. 計算機工程與應用,2002.38(4), 48-50.
[14] 王曉波 蔡漢明 王軍 崔慧敏. 設計模式在線切割CAD軟件開發中的應用. 機電工程技術,2006.35(2),44-47.
[15] 肖保良 宋東 趙勝. 基于模式的ATS領域框架研究. 計算機測量與控制,2007.15(9), 1144-1147.
[16] 夏克長. Composite模式的C#實現. 計算機時代,2006.(3), 3-5.
[17] 倪葉青. 合成(Composite)模式及在range處理中的應用. 電腦知識與技術:學術交流,2005.(8), 50-52.
[18] 鄧楠 苑津莎 楊薛明. 基于組合模式的地理信息矢量圖元可重用性的研究. 電力系統通信,2005.26(5), 57-60.
[19] 肖志峰 龔健雅 王艷東 翟曉芳. 面向對象的軟件設計模式在配電GIS中的應用. 測繪信息與工程,2005.30(3), 3-5.
[20] 聶穎. 設計模式在圖形處理軟件中的應用. 計算機應用,2004.24(B12), 189-191.
[21] Quarkus官網. https://quarkus.io/
總結
以上是生活随笔為你收集整理的08-合成模式Quarkus实现的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。