摘要:組合模式的圖組成部分組合對(duì)象為組合中的對(duì)象聲明接口,在適當(dāng)?shù)那闆r下,實(shí)現(xiàn)所有類共有接口的默認(rèn)行為,聲明用于訪問(wèn)和管理其子組件的接口。組合模式對(duì)單個(gè)對(duì)象葉子對(duì)象和組合對(duì)象容器對(duì)象的使用具有一致性。
概述組合模式(Composite Pattern)屬于結(jié)構(gòu)型模式的一種,組合多個(gè)對(duì)象形成樹(shù)形結(jié)構(gòu)來(lái)表示部分 - 整體的結(jié)構(gòu)層次,對(duì)單個(gè)對(duì)象(葉子對(duì)象)和組合對(duì)象(容器對(duì)象)的使用具有一致性
組合模式對(duì)單個(gè)對(duì)象(葉子對(duì)象)和組合對(duì)象(容器對(duì)象)具有一致性,它將對(duì)象組織到樹(shù)結(jié)構(gòu)中,可以用來(lái)描述整體與部分的關(guān)系。同時(shí)它也模糊了簡(jiǎn)單元素(葉子對(duì)象)和復(fù)雜元素(容器對(duì)象)的概念,使得客戶能夠像處理簡(jiǎn)單元素一樣來(lái)處理復(fù)雜元素,從而使客戶程序能夠與復(fù)雜元素的內(nèi)部結(jié)構(gòu)解耦。
組合模式的UML圖
組成部分
Component(組合對(duì)象):為組合中的對(duì)象聲明接口,在適當(dāng)?shù)那闆r下,實(shí)現(xiàn)所有類共有接口的默認(rèn)行為,聲明用于訪問(wèn)和管理其子組件的接口。
Leaf(葉子對(duì)象):定義組合中原始對(duì)象的行為,葉子節(jié)點(diǎn)下再無(wú)節(jié)點(diǎn)
Composite(容器對(duì)象):定義所有節(jié)點(diǎn)行為,存儲(chǔ)子組件,在Component接口中實(shí)現(xiàn)與子組件有關(guān)操作,如增加(add)和刪除(remove)等。
案例在一個(gè)公司中,有5名員工。最高的職位是1名總經(jīng)理。總經(jīng)理下,有兩名員工,一名是經(jīng)理,另一名是開(kāi)發(fā)人員,另外一名經(jīng)理有兩名開(kāi)發(fā)人員在他下面工作。所有員工的名字和薪水從上到下。
樹(shù)結(jié)構(gòu)例如:
透明方式透明方式UML:
創(chuàng)建Employee(組合對(duì)象)的接口文件,含基本操作
public interface Employee { void add(Employee employee); void remove(Employee employee); void print(); //省略其它方法,如 getChild }
創(chuàng)建Developer(葉子節(jié)點(diǎn)),所有訪問(wèn)子項(xiàng)相關(guān)的所有操作都將為空,因?yàn)樗鼪](méi)有子項(xiàng),但透明方式的緣故,即使用不上也需定義空實(shí)現(xiàn)
public class Developer implements Employee { private String name; private double salary; public Developer(String name, double salary) { this.name = name; this.salary = salary; } @Override public void add(Employee employee) { //葉子節(jié)點(diǎn),該方法不適用于當(dāng)前類 } @Override public void remove(Employee employee) { //葉子節(jié)點(diǎn),該方法不適用于當(dāng)前類 } @Override public void print() { System.out.println("-------------"); System.out.print("Name = " + this.name); System.out.println(" Salary = " + this.salary); System.out.println("-------------"); } }
創(chuàng)建Manager(容器對(duì)象),具有訪問(wèn)和修改子對(duì)象的方法。
public class Manager implements Employee { private String name; private double salary; public Manager(String name, double salary) { this.name = name; this.salary = salary; } private Listemployees = new ArrayList<>(); @Override public void add(Employee employee) { employees.add(employee); } @Override public void remove(Employee employee) { employees.remove(employee); } @Override public void print() { System.out.println("-------------"); System.out.print("Name = " + this.name); System.out.println(" Salary = " + this.salary); System.out.println("-------------"); for (Employee employee : employees) { employee.print(); } } }
Client測(cè)試類
public class Client { public static void main(String[] args) { Employee emp1 = new Developer("員工 - 小李", 10000); Employee emp2 = new Developer("員工 - 小王", 15000); Employee manager1 = new Manager("經(jīng)理 - 邱東", 25000); manager1.add(emp1); manager1.add(emp2); Employee emp3 = new Developer("員工 - 小唐", 20000); Manager generalManager = new Manager("總經(jīng)理 - 覃飛", 50000); generalManager.add(emp3); generalManager.add(manager1); generalManager.print(); } }
運(yùn)行結(jié)果
------------- Name = 總經(jīng)理 - 覃飛 Salary = 50000.0 ------------- ------------- Name = 員工 - 小唐 Salary = 20000.0 ------------- ------------- Name = 經(jīng)理 - 邱東 Salary = 25000.0 ------------- ------------- Name = 員工 - 小李 Salary = 10000.0 ------------- ------------- Name = 員工 - 小王 Salary = 15000.0 -------------安全方式
安全方式UML:
只保留公共部分,Component(組合對(duì)象)中不去申明add/remove等方法,這樣Leaf(葉子對(duì)象)就不用去實(shí)現(xiàn)它了,而是在Composite中申明所有管理子類對(duì)象的方法,但由于這樣做不夠透明,相對(duì)安全
public interface Employee { void print(); }JDK中的用法
java.util.Map#putAll(Map)
java.util.List#addAll(Collection)
java.util.Set#addAll(Collection)
java.nio.ByteBuffer#put(ByteBuffer) (CharBuffer, ShortBuffer, IntBuffer, LongBuffer, FloatBuffer, DoubleBuffer)
總結(jié)組合模式用于將多個(gè)對(duì)象組合成樹(shù)形結(jié)構(gòu)以表示整體-部分的結(jié)構(gòu)層次。組合模式對(duì)單個(gè)對(duì)象(葉子對(duì)象)和組合對(duì)象(容器對(duì)象)的使用具有一致性。
組合對(duì)象的關(guān)鍵在于它定義了一個(gè)抽象構(gòu)建類,它既可表示葉子對(duì)象,也可表示容器對(duì)象,客戶僅僅需要針對(duì)這個(gè)抽象構(gòu)建進(jìn)行編程,無(wú)須知道他是葉子對(duì)象還是容器對(duì)象,都是一致對(duì)待。
組合模式雖然能夠非常好地處理層次結(jié)構(gòu),也使得客戶端程序變得簡(jiǎn)單,但是它也使得設(shè)計(jì)變得更加抽象,而且也很難對(duì)容器中的構(gòu)件類型進(jìn)行限制,這會(huì)導(dǎo)致在增加新的構(gòu)件時(shí)會(huì)產(chǎn)生一些問(wèn)題。
優(yōu)點(diǎn)
可以清楚地定義分層次的復(fù)雜對(duì)象,表示對(duì)象的全部或部分層次,使得增加新構(gòu)件也更容易。
客戶端調(diào)用簡(jiǎn)單,客戶端可以一致的使用組合結(jié)構(gòu)或其中單個(gè)對(duì)象。
更容易在組合體內(nèi)加入對(duì)象構(gòu)件,客戶端不必因?yàn)榧尤肓诵碌膶?duì)象構(gòu)件而更改原有代碼。
缺點(diǎn)
設(shè)計(jì)變得更加抽象,業(yè)務(wù)規(guī)則復(fù)雜的對(duì)象,組合模式實(shí)現(xiàn)就越困難,且不是所有的方法都與葉子對(duì)象子類都有關(guān)聯(lián)
適用場(chǎng)景
需要表示一個(gè)對(duì)象整體或部分層次,在具有整體和部分的層次結(jié)構(gòu)中,希望通過(guò)一種方式忽略整體與部分的差異,可以一致地對(duì)待它們。
讓客戶能夠忽略不同對(duì)象層次的變化,客戶端可以針對(duì)抽象構(gòu)件編程,無(wú)須關(guān)心對(duì)象層次結(jié)構(gòu)的細(xì)節(jié)。
- 說(shuō)點(diǎn)什么參考文獻(xiàn):https://www.cnblogs.com/chenssy/p/3299719.html
全文代碼:https://gitee.com/battcn/design-pattern/tree/master/Chapter7/battcn-composite
個(gè)人QQ:1837307557
battcn開(kāi)源群(適合新手):391619659
微信公眾號(hào):battcn(歡迎調(diào)戲)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/68012.html
摘要:命令模式屬于行為型模式的一種,又稱為行動(dòng)模式或交易模式。結(jié)構(gòu)圖模式結(jié)構(gòu)抽象命令類聲明了用于執(zhí)行請(qǐng)求的的等方法具體命令類抽象命令類的子類,對(duì)應(yīng)具體的接收者對(duì)象,將接收者對(duì)象的動(dòng)作綁定其中。 命令模式(Command Pattern)屬于行為型模式的一種,又稱為行動(dòng)(Action)模式或交易(Transaction)模式。將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,從而達(dá)到用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化,對(duì)于...
摘要:橋接模式屬于結(jié)構(gòu)型模式的一種,用于把抽象化與實(shí)現(xiàn)化解耦,使得二者可以獨(dú)立變化,它通過(guò)提供抽象化和實(shí)現(xiàn)化之間的橋接結(jié)構(gòu),來(lái)實(shí)現(xiàn)二者的解耦。相關(guān)模式裝飾模式與橋接模式在一定程度上都是為了減少子類的數(shù)目,避免出現(xiàn)復(fù)雜的繼承關(guān)系。 橋接模式(Brideg Pattern)屬于結(jié)構(gòu)型模式的一種,用于把抽象化與實(shí)現(xiàn)化解耦,使得二者可以獨(dú)立變化,它通過(guò)提供抽象化和實(shí)現(xiàn)化之間的橋接結(jié)構(gòu),來(lái)實(shí)現(xiàn)二者的解...
摘要:建議盡量使用對(duì)象的適配器模式,少用繼承。適配器模式也是一種包裝模式,它與裝飾模式同樣具有包裝的功能,此外,對(duì)象適配器模式還具有委托的意思。 適配器模式(Adapter Pattern)屬于結(jié)構(gòu)型模式的一種,把一個(gè)類的接口變成客戶端所期待的另一種接口,從而使原本接口不匹配而無(wú)法一起工作的兩個(gè)類能夠在一起工作... 概述 當(dāng)你想使用一個(gè)已經(jīng)存在的類,而它的接口不符合你的需求,或者你想創(chuàng)建...
摘要:設(shè)計(jì)模式的分類經(jīng)典應(yīng)用框架中常見(jiàn)的設(shè)計(jì)模式分為三類創(chuàng)建型模式對(duì)類的實(shí)例化過(guò)程的抽象。對(duì)象的結(jié)構(gòu)模式是動(dòng)態(tài)的。對(duì)象的行為模式則使用對(duì)象的聚合來(lái)分配行為。設(shè)計(jì)模式是個(gè)好東西,以后肯定還要進(jìn)一步的學(xué)習(xí),并且在項(xiàng)目中多實(shí)踐,提升自己的設(shè)計(jì)能力。 什么是設(shè)計(jì)模式? Christopher Alexander?說(shuō)過(guò):每一個(gè)模式描述了一個(gè)在我們周圍不斷重復(fù)發(fā)生的問(wèn)題,以及該問(wèn)題的解決方案的核心。這樣...
摘要:抽象工廠模式提供了創(chuàng)建一系列相互依賴對(duì)象的接口,無(wú)需指定具體類抽象工廠模式是圍繞著一個(gè)超級(jí)工廠工作,創(chuàng)造其它的工廠類,也被稱為工廠的工廠,這種類型的設(shè)計(jì)模式是創(chuàng)造性的模式,因?yàn)檫@種模式提供了創(chuàng)建對(duì)象的最佳方法之一。 工廠模式是JAVA中最常用的設(shè)計(jì)模式之一,使用工廠模式后,創(chuàng)建對(duì)象的時(shí)候不在將創(chuàng)建邏輯暴露給客戶端,而是通過(guò)實(shí)現(xiàn)接口的方式創(chuàng)建對(duì)象,這種設(shè)計(jì)模式也是對(duì)象實(shí)例化的最佳方式。 ...
閱讀 3209·2021-11-23 09:51
閱讀 3669·2021-09-22 15:35
閱讀 3646·2021-09-22 10:02
閱讀 2956·2021-08-30 09:49
閱讀 509·2021-08-05 10:01
閱讀 3376·2019-08-30 15:54
閱讀 1633·2019-08-30 15:53
閱讀 3558·2019-08-29 16:27