JAVA設(shè)計(jì)模式之組合模式原理與用法詳解
本文實(shí)例講述了JAVA設(shè)計(jì)模式之組合模式。分享給大家供大家參考,具體如下:
組合(整體與部分關(guān)系)模式:將不同但是相關(guān)的對象組合成樹形結(jié)構(gòu)以實(shí)現(xiàn)“部分-整體”的層次結(jié)構(gòu),使得用戶對單個(gè)對象和組合對象的使用具有一致性。
* 模式角色組成:
1.Component對象: 是組合中的對象接口,是所有類共有的接口。是用于統(tǒng)一定義整體中的部分。
2.Leaf對象: 整體中的部分,沒有下一級。
3.Composite對象: 用來存儲子部件,在Component接口中實(shí)現(xiàn)與部分有關(guān)操作。
以公司構(gòu)成為例,比如公司有總公司,總公司下有分公司,分公司下有辦事處等。構(gòu)成一個(gè)樹形結(jié)構(gòu)。
/** * 抽象類:用來管理子類 * @description: * @date 2016-1-22 下午1:16:25 */ public abstract class Firm { private String firmName;// 公司名稱 public Firm(String firmName) { this.firmName = firmName; } public String getFirmName() { return firmName; } public void setFirmName(String name) { this.firmName = name; } protected abstract void append(Firm firm);// 添加公司如:新增分公司 protected abstract void romove(Firm firm);// 刪除公司:如因故關(guān)閉分公司 protected abstract void show(int level);//顯示公司所在的層級:總公司,分公司,辦事處等 }
/** * 分公司對象 * @description: * @date 2016-1-22 下午1:25:43 */ public class BranchFirm extends Firm { private List<Firm> cList; public BranchFirm(String name) { super(name); cList = new ArrayList<Firm>(); } @Override protected void append(Firm firm) { cList.add(firm); } @Override protected void show(int depth) { StringBuilder sb = new StringBuilder(""); for (int i = 0; i < depth; i++) { sb.append("*"); } System.out.println(new String(sb) + this.getFirmName()); for (Firm c : cList) { c.show(depth + 2); } } @Override protected void romove(Firm firm) { // TODO Auto-generated method stub cList.remove(firm); } }
/** * Leaf結(jié)點(diǎn)類:公司市場部 * @description: * @date 2016-1-22 下午1:46:02 */ public class MarketDepartment extends Firm { public MarketDepartment(String name) { super(name); } @Override protected void append(Firm company) { } @Override protected void show(int depth) { // TODO Auto-generated method stub StringBuilder sb = new StringBuilder(""); for (int i = 0; i < depth; i++) { sb.append("*"); } System.out.println(new String(sb) + this.getFirmName()); } @Override protected void romove(Firm company) { } }
/** * Leaf結(jié)點(diǎn)類:公司技術(shù)部 * @description: * @date 2016-1-22 下午1:21:41 */ public class MinTechDepartment extends Firm { public MinTechDepartment(String name) { super(name); } @Override protected void append(Firm firm) { } @Override protected void show(int depth) { StringBuilder sb = new StringBuilder(""); for (int i = 0; i < depth; i++) { sb.append("*"); } System.out.println(new String(sb) + this.getFirmName()); } @Override protected void romove(Firm company) { } }
public class Test { public static void main(String[] args) { // TODO Auto-generated method stub Firm head = new BranchFirm("深圳XX集團(tuán)有限公司");// 公司總部 head.append(new MarketDepartment("深圳XX集團(tuán)有限公司--市場部")); head.append(new MinTechDepartment("深圳XX集團(tuán)有限公司--技術(shù)部")); Firm jsFirm = new BranchFirm("深圳XX集團(tuán)有限公司-江蘇分公司"); jsFirm.append(new MarketDepartment("深圳XX集團(tuán)有限公司-江蘇分公司市場部")); jsFirm.append(new MinTechDepartment("深圳XX集團(tuán)有限公司-江蘇分公司技術(shù)部")); Firm szFirm = new BranchFirm("深圳XX集團(tuán)有限公司-江蘇分公司-蘇州辦事處"); szFirm.append(new MinTechDepartment("深圳XX集團(tuán)有限公司-江蘇分公司-蘇州辦事處技術(shù)部")); szFirm.append(new MarketDepartment("深圳XX集團(tuán)有限公司-江蘇分公司-蘇州辦事處市場部")); jsFirm.append(szFirm); // 如果還需要新增分公司或辦事處等,就繼續(xù)按照上述操作處理 head.append(jsFirm); head.show(0); } }
通常:在需要表示對象的整體與部分層次結(jié)構(gòu)或需要忽略組合的整體對象與部分對象的不同,統(tǒng)一地使用整體中的部門情況下來使用組合模式。
更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設(shè)計(jì)有所幫助。
相關(guān)文章
swagger文檔增強(qiáng)工具knife4j使用圖文詳解
這篇文章主要介紹了swagger文檔增強(qiáng)工具knife4j使用詳解,想要使用knife4j非常簡單,只要在Springboot項(xiàng)目中引入knife4j的依賴即可,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08Java中Map與對象之間互相轉(zhuǎn)換的幾種常用方式
在Java中將對象和Map相互轉(zhuǎn)換是常見的操作,可以通過不同的方式實(shí)現(xiàn)這種轉(zhuǎn)換,下面這篇文章主要給大家介紹了關(guān)于Java中Map與對象之間互相轉(zhuǎn)換的幾種常用方式,需要的朋友可以參考下2024-01-01SpringBoot整合MyBatis實(shí)現(xiàn)樂觀鎖和悲觀鎖的示例
這篇文章主要介紹了SpringBoot整合MyBatis實(shí)現(xiàn)樂觀鎖和悲觀鎖的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09