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

Component :這是組合模式中的抽象構(gòu)件,他里面定義了所有類共有的默認(rèn)行為,用來訪問和管理Component的子部件,Component可以是抽象類,也可以是接口
leaf :在組合模式中表示葉子節(jié)點,葉子節(jié)點沒有子節(jié)點了,他是最末端存放數(shù)據(jù)的結(jié)構(gòu)
Composite:非葉子節(jié)點,下面仍然有分支,用來存儲分支,實現(xiàn)了Component 定義的默認(rèn)行為
案例
需求
商場的服裝店,專賣店,衣服,褲子的關(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();
}
}
}定義運動裝
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());
}
}
}定義測試類
public class Test {
public static void main(String[] args) {
// 服裝店
Component store = new Store("服裝店","服裝店");
// 專賣店
Component brandStore1 = new BrandStore("李寧服裝專賣店","李寧服裝專賣店");
Component brandStore2 = new BrandStore("361服裝專賣店","361服裝專賣店");
// 運動裝
Component sportswear1 = new Sportswear("運動裝","運動裝");
Component sportswear2 = new Sportswear("休閑裝","休閑裝");
brandStore1.add(sportswear1);
brandStore2.add(sportswear2);
store.add(brandStore1);
store.add(brandStore2);
store.show();
}
}查看測試結(jié)果

分析
該案例中,服裝店(Store),專賣店(BrandStore),運動裝(Sportswear)都繼承了抽象構(gòu)件(Component),通過持有一個list來管理自身持有的對象,這樣客戶端就可以一致處理單個對象和組合對象,屏蔽了對象層次的差異性,這樣的話,一致的行為就可以控制不同的層次了。
總結(jié)
優(yōu)勢
組合模式可以使得客戶端代碼可以一致的處理單個對象和組合對象,無須關(guān)心自己處理的是單個還是組合,屏蔽了對象系統(tǒng)的層次差異性,這樣的話一致的行為就可以控制不同層次了
擴(kuò)展性非常高,可以很方便的增加葉子節(jié)點和非葉子節(jié)點,并且對于現(xiàn)有的類庫無侵入,滿足開閉原則
劣勢
如果說各個節(jié)點有很大差異的話,不適合使用組合模式
使用場景
處理樹形結(jié)構(gòu),具備統(tǒng)一行為,建議大家使用組合模式
想體現(xiàn)對象的部分,整體結(jié)構(gòu)的時候,可以使用組合模式,典型一點例如文件和文件夾
到此這篇關(guān)于Java設(shè)計模式之組合模式的示例詳解的文章就介紹到這了,更多相關(guān)Java組合模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Eclipse+Java+Swing實現(xiàn)學(xué)生成績管理系統(tǒng)的實例代碼
這篇文章主要介紹了Eclipse+Java+Swing實現(xiàn)學(xué)生成績管理系統(tǒng),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01
Java調(diào)用打印機(jī)的2種方式舉例(無驅(qū)/有驅(qū))
我們平時使用某些軟件或者在超市購物的時候都會發(fā)現(xiàn)可以使用打印機(jī)進(jìn)行打印,這篇文章主要給大家介紹了關(guān)于Java調(diào)用打印機(jī)的2種方式,分別是無驅(qū)/有驅(qū)的相關(guān)資料,需要的朋友可以參考下2023-11-11
Spring Boot中使用Activiti的方法教程(二)
工作流(Workflow),就是“業(yè)務(wù)過程的部分或整體在計算機(jī)應(yīng)用環(huán)境下的自動化”,下面這篇文章主要給大家介紹了關(guān)于Spring Boot中使用Activiti的相關(guān)資料,需要的朋友可以參考下2018-08-08
利用Java設(shè)置Word文本框中的文字旋轉(zhuǎn)方向的實現(xiàn)方法
Word文檔中可添加文本框,并設(shè)置文本框為橫向文本排列或是縱向文本排列,或者設(shè)置文本框中的文字旋轉(zhuǎn)方向等.通過Java程序代碼,也可以實現(xiàn)以上文本框的操作.下面以Java代碼示例展示具體的實現(xiàn)步驟.另外,可參考C#及VB.NET代碼的實現(xiàn)方法,需要的朋友可以參考下2021-06-06
Java?InputStream實戰(zhàn)之輕松讀取操作文件流
在Java中,輸入輸出是非常重要的基礎(chǔ)功能,其中,InputStream是Java中的一個重要輸入流類,用于從輸入源讀取數(shù)據(jù),下面我們就來學(xué)習(xí)一下InputStream類的相關(guān)知識吧2023-10-10

