Java設(shè)計(jì)模式之組合模式的示例詳解
定義
組合模式,又叫部分整體模式,它創(chuàng)建了對(duì)象組的數(shù)據(jù)結(jié)構(gòu)(將對(duì)象組合成樹(shù)狀結(jié)構(gòu),用來(lái)表示部分整體的層級(jí)關(guān)系)組合模式使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的訪問(wèn)具有一致性
原理類圖

Component :這是組合模式中的抽象構(gòu)件,他里面定義了所有類共有的默認(rèn)行為,用來(lái)訪問(wèn)和管理Component的子部件,Component可以是抽象類,也可以是接口
leaf :在組合模式中表示葉子節(jié)點(diǎn),葉子節(jié)點(diǎn)沒(méi)有子節(jié)點(diǎn)了,他是最末端存放數(shù)據(jù)的結(jié)構(gòu)
Composite:非葉子節(jié)點(diǎn),下面仍然有分支,用來(lái)存儲(chǔ)分支,實(shí)現(xiàn)了Component 定義的默認(rèn)行為
案例
需求
商場(chǎng)的服裝店,專賣店,衣服,褲子的關(guān)系
方案
定義組合模式的抽象構(gòu)件
public abstract class Component {
private String name;
private String desc;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public Component(String name, String desc) {
this.name = name;
this.desc = desc;
}
public void add(Component component){
throw new UnsupportedOperationException();
}
public void remove(Component component){
throw new UnsupportedOperationException();
}
public abstract void show();
}定義服裝商鋪類
public class Store extends Component{
List<Component> componentList = new ArrayList<Component>();
public Store(String name, String desc){
super(name, desc);
}
@Override
public String getName() {
return super.getName();
}
@Override
public String getDesc() {
return super.getDesc();
}
@Override
public void add(Component component) {
System.out.println("添加:" + getName());
componentList.add(component);
}
@Override
public void remove(Component component) {
System.out.println("移除:" + getName());
componentList.remove(component);
}
@Override
public void show() {
for (Component component : componentList) {
System.out.println(component.getName());
component.show();
}
}
}定義服裝專賣店商鋪
public class BrandStore extends Component{
List<Component> componentList = new ArrayList<Component>();
public BrandStore(String name, String desc) {
super(name, desc);
}
@Override
public String getName() {
return super.getName();
}
@Override
public String getDesc() {
return super.getDesc();
}
@Override
public void add(Component component) {
componentList.add(component);
}
@Override
public void remove(Component component) {
componentList.remove(component);
}
@Override
public void show() {
for (Component component : componentList) {
System.out.println(component.getName());
component.show();
}
}
}定義運(yùn)動(dòng)裝
public class Sportswear extends Component{
List<Component> componentList = new ArrayList<Component>();
@Override
public String getName() {
return super.getName();
}
@Override
public String getDesc() {
return super.getDesc();
}
public Sportswear(String name, String desc) {
super(name, desc);
}
@Override
public void add(Component component) {
componentList.add(component);
}
@Override
public void remove(Component component) {
componentList.remove(component);
}
@Override
public void show() {
for (Component component: componentList) {
System.out.println(component.getName());
}
}
}定義測(cè)試類
public class Test {
public static void main(String[] args) {
// 服裝店
Component store = new Store("服裝店","服裝店");
// 專賣店
Component brandStore1 = new BrandStore("李寧服裝專賣店","李寧服裝專賣店");
Component brandStore2 = new BrandStore("361服裝專賣店","361服裝專賣店");
// 運(yùn)動(dòng)裝
Component sportswear1 = new Sportswear("運(yùn)動(dòng)裝","運(yùn)動(dòng)裝");
Component sportswear2 = new Sportswear("休閑裝","休閑裝");
brandStore1.add(sportswear1);
brandStore2.add(sportswear2);
store.add(brandStore1);
store.add(brandStore2);
store.show();
}
}查看測(cè)試結(jié)果

分析
該案例中,服裝店(Store),專賣店(BrandStore),運(yùn)動(dòng)裝(Sportswear)都繼承了抽象構(gòu)件(Component),通過(guò)持有一個(gè)list來(lái)管理自身持有的對(duì)象,這樣客戶端就可以一致處理單個(gè)對(duì)象和組合對(duì)象,屏蔽了對(duì)象層次的差異性,這樣的話,一致的行為就可以控制不同的層次了。
總結(jié)
優(yōu)勢(shì)
組合模式可以使得客戶端代碼可以一致的處理單個(gè)對(duì)象和組合對(duì)象,無(wú)須關(guān)心自己處理的是單個(gè)還是組合,屏蔽了對(duì)象系統(tǒng)的層次差異性,這樣的話一致的行為就可以控制不同層次了
擴(kuò)展性非常高,可以很方便的增加葉子節(jié)點(diǎn)和非葉子節(jié)點(diǎn),并且對(duì)于現(xiàn)有的類庫(kù)無(wú)侵入,滿足開(kāi)閉原則
劣勢(shì)
如果說(shuō)各個(gè)節(jié)點(diǎn)有很大差異的話,不適合使用組合模式
使用場(chǎng)景
處理樹(shù)形結(jié)構(gòu),具備統(tǒng)一行為,建議大家使用組合模式
想體現(xiàn)對(duì)象的部分,整體結(jié)構(gòu)的時(shí)候,可以使用組合模式,典型一點(diǎn)例如文件和文件夾
到此這篇關(guān)于Java設(shè)計(jì)模式之組合模式的示例詳解的文章就介紹到這了,更多相關(guān)Java組合模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中的concurrenthashmap集合詳細(xì)剖析
這篇文章主要介紹了Java中的concurrenthashmap集合詳細(xì)剖析,有參構(gòu)造后第一次put時(shí)會(huì)進(jìn)行初始化,由源碼可知,會(huì)先判斷所傳入的容量是否>=最大容量的一半,如果滿足條件,就會(huì)將容量修改為最大值,反之則會(huì)將容量改為所傳入數(shù)*1.5+1,需要的朋友可以參考下2023-11-11
mac下修改idea的jvm運(yùn)行參數(shù)解決idea卡頓的情況
這篇文章主要介紹了mac下修改idea的jvm運(yùn)行參數(shù)解決idea卡頓的情況,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
解決springboot中配置過(guò)濾器以及可能出現(xiàn)的問(wèn)題
這篇文章主要介紹了解決springboot中配置過(guò)濾器以及可能出現(xiàn)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
解決springboot 連接 mysql 時(shí)報(bào)錯(cuò) using password: NO的方案
在本篇文章里小編給大家整理了關(guān)于解決springboot 連接 mysql 時(shí)報(bào)錯(cuò) using password: NO的方案,有需要的朋友們可以學(xué)習(xí)下。2020-01-01
從dubbo zookeeper注冊(cè)地址提取出zookeeper地址的方法
今天小編就為大家分享一篇關(guān)于從dubbo zookeeper注冊(cè)地址提取出zookeeper地址的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12
簡(jiǎn)單講解java中throws與throw的區(qū)別
這篇文章主要介紹了簡(jiǎn)單講解java中throws與throw的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
Java 同步鎖(synchronized)詳解及實(shí)例
這篇文章主要介紹了Java 同步鎖(synchronized)詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-03-03
java微信開(kāi)發(fā)API第四步 微信自定義個(gè)性化菜單實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了java微信開(kāi)發(fā)API第四步,自定義菜單以及個(gè)性化菜單實(shí)現(xiàn) ,感興趣的小伙伴們可以參考一下2016-06-06
SpringBoot異常錯(cuò)誤頁(yè)面實(shí)現(xiàn)方法介紹
在項(xiàng)目訪問(wèn)的時(shí)候我們經(jīng)常會(huì)發(fā)生錯(cuò)誤或者頁(yè)面找不到,比如:資源找不到404,服務(wù)器500錯(cuò)誤,默認(rèn)情況下springboot的處理機(jī)制都是去跳轉(zhuǎn)內(nèi)部的錯(cuò)誤地址:/error 和與之對(duì)應(yīng)的一個(gè)錯(cuò)誤頁(yè)面2022-09-09

