Java設計模式之組合模式的示例詳解
定義
組合模式,又叫部分整體模式,它創建瞭對象組的數據結構(將對象組合成樹狀結構,用來表示部分整體的層級關系)組合模式使得用戶對單個對象和組合對象的訪問具有一致性
原理類圖
Component :這是組合模式中的抽象構件,他裡面定義瞭所有類共有的默認行為,用來訪問和管理Component的子部件,Component可以是抽象類,也可以是接口
leaf :在組合模式中表示葉子節點,葉子節點沒有子節點瞭,他是最末端存放數據的結構
Composite:非葉子節點,下面仍然有分支,用來存儲分支,實現瞭Component 定義的默認行為
案例
需求
商場的服裝店,專賣店,衣服,褲子的關系
方案
定義組合模式的抽象構件
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(); } }
查看測試結果
分析
該案例中,服裝店(Store),專賣店(BrandStore),運動裝(Sportswear)都繼承瞭抽象構件(Component),通過持有一個list來管理自身持有的對象,這樣客戶端就可以一致處理單個對象和組合對象,屏蔽瞭對象層次的差異性,這樣的話,一致的行為就可以控制不同的層次瞭。
總結
優勢
組合模式可以使得客戶端代碼可以一致的處理單個對象和組合對象,無須關心自己處理的是單個還是組合,屏蔽瞭對象系統的層次差異性,這樣的話一致的行為就可以控制不同層次瞭
擴展性非常高,可以很方便的增加葉子節點和非葉子節點,並且對於現有的類庫無侵入,滿足開閉原則
劣勢
如果說各個節點有很大差異的話,不適合使用組合模式
使用場景
處理樹形結構,具備統一行為,建議大傢使用組合模式
想體現對象的部分,整體結構的時候,可以使用組合模式,典型一點例如文件和文件夾
到此這篇關於Java設計模式之組合模式的示例詳解的文章就介紹到這瞭,更多相關Java組合模式內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!