說明
記錄下學(xué)習(xí)設(shè)計(jì)模式-組合模式的寫法。JDK使用版本為1.8版本。
Composite(組合)
意圖:將對(duì)象組合成樹型結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu)。Composite使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。
結(jié)構(gòu):
其中:
- Component為組合中的對(duì)象聲明接口;在適當(dāng)情況下實(shí)現(xiàn)所有類共有接口的默認(rèn)行為;聲明一個(gè)接口用于訪問和管理Component的子組件;(可選)在遞歸結(jié)構(gòu)中定義一個(gè)接口,用于訪問一個(gè)父組件,并在合適的情況下實(shí)現(xiàn)它。
- Leaf在組合中表示葉結(jié)點(diǎn)對(duì)象,葉結(jié)點(diǎn)沒有子結(jié)點(diǎn);在組合中定義圖元對(duì)象的行為。
- Composite定義有子組件的那些組件的行為;存儲(chǔ)子組件;在Component接口中實(shí)現(xiàn) 與子組件有關(guān)的操作。
- Client通過Component接口操縱組合組件的對(duì)象。
適用性:
- 想表示對(duì)象的部分-整體層次結(jié)構(gòu)。
- 希望用戶忽略組合對(duì)象與單個(gè)對(duì)象的不同,用戶將統(tǒng)一地使用組合結(jié)構(gòu)中的所有對(duì)象。
使用場(chǎng)景:
組合模式正是應(yīng)樹型結(jié)構(gòu)而生,所以組合模式的使用場(chǎng)景就是出現(xiàn)樹形結(jié)構(gòu)的地方。比如:文件目錄顯示,多級(jí)目錄呈現(xiàn)等樹形結(jié)構(gòu)數(shù)據(jù)的操作。
目錄
組合模式示例類圖
以該UML類圖實(shí)現(xiàn)組合模式示例。
菜單組件抽象類
package com.example.deesign_patterns.composite;
//菜單組件類
public abstract class MenuComponent {
//菜單組件的名稱
protected String name;
//菜單組件的層級(jí)
protected int level;
//添加子菜單
public void add(MenuComponent menuComponent){
throw new UnsupportedOperationException();
}
//移除子菜單
public void remove(MenuComponent menuComponent){
throw new UnsupportedOperationException();
}
//獲取指定的子菜單
public MenuComponent getChild(int index){
throw new UnsupportedOperationException();
}
//獲取菜單或者菜單項(xiàng)的名稱
public String getName(){
return name;
}
//打印菜單名稱的方法(包含子菜單和子菜單項(xiàng))
public abstract void print();
}
菜單類
package com.example.deesign_patterns.composite;
import java.util.ArrayList;
import java.util.List;
//菜單類
public class Menu extends MenuComponent{
//菜單可以有多個(gè)子菜單或者子菜單項(xiàng)
private List<MenuComponent> menuComponentList=new ArrayList<MenuComponent>();
//構(gòu)造方法
public Menu(String name,int level) {
this.name=name;
this.level=level;
}
@Override
public void add(MenuComponent menuComponent) {
menuComponentList.add(menuComponent);
}
@Override
public void remove(MenuComponent menuComponent) {
menuComponentList.remove(menuComponent);
}
@Override
public MenuComponent getChild(int index) {
return menuComponentList.get(index);
}
@Override
public void print() {
//打印菜單名稱
for(int i=0;i<level;i++){
System.out.print("--");
}
System.out.println(name);
//打印子菜單或者子菜單項(xiàng)名稱
for(MenuComponent component:menuComponentList){
component.print();
}
}
}
菜單項(xiàng)類
package com.example.deesign_patterns.composite;
//菜單項(xiàng)類
public class MenuItem extends MenuComponent{
//構(gòu)造方法
public MenuItem(String name,int level) {
this.name=name;
this.level=level;
}
@Override
public void print() {
//打印菜單項(xiàng)的名稱
for(int i=0;i<level;i++){
System.out.print("--");
}
System.out.println(name);
}
}
測(cè)試類
package com.example.deesign_patterns.composite;
//測(cè)試類
public class Client {
public static void main(String[] args) {
//創(chuàng)建菜單樹
MenuComponent menu1=new Menu("菜單管理",2);
menu1.add(new MenuItem("頁面訪問",3));
menu1.add(new MenuItem("展開菜單",3));
menu1.add(new MenuItem("編輯菜單",3));
menu1.add(new MenuItem("刪除菜單",3));
menu1.add(new MenuItem("新增菜單",3));
MenuComponent menu2=new Menu("權(quán)限配置",2);
menu2.add(new MenuItem("頁面訪問",3));
menu2.add(new MenuItem("提交保存",3));
MenuComponent menu3=new Menu("角色管理",2);
menu3.add(new MenuItem("頁面訪問",3));
menu3.add(new MenuItem("新增角色",3));
menu3.add(new MenuItem("修改角色",3));
//創(chuàng)建一級(jí)菜單
MenuComponent component=new Menu("系統(tǒng)管理",1);
//將二級(jí)菜單添加到一級(jí)菜單
component.add(menu1);
component.add(menu2);
component.add(menu3);
//打印菜單名稱(如果有子菜單一塊打印)
component.print();
}
}
文章來源:http://www.zghlxwxcb.cn/news/detail-501163.html
好處:文章來源地址http://www.zghlxwxcb.cn/news/detail-501163.html
- 組合模式可以清楚地定義分層次的復(fù)雜對(duì)象,表示對(duì)象的全部或部分層次,它讓客戶端忽略了層次的差異,方便對(duì)整個(gè)層次結(jié)構(gòu)進(jìn)行控制。
- 客戶端可以一致地使用一個(gè)組合結(jié)構(gòu)或其中單個(gè)對(duì)象,不必關(guān)心處理的是單個(gè)對(duì)象還是整個(gè)組合對(duì)象,簡(jiǎn)化了客戶端代碼。
- 在組合模式中增加新的樹枝節(jié)點(diǎn)和葉子節(jié)點(diǎn)都很方便,無須對(duì)現(xiàn)有類庫(kù)進(jìn)行任何修改,符合開閉原則。
- 組合模式為樹形結(jié)構(gòu)的面向?qū)ο髮?shí)現(xiàn)提供了一種靈活的解決方案,通過葉子節(jié)點(diǎn)和樹枝節(jié)點(diǎn)的遞歸組合,可以形成復(fù)雜的樹形結(jié)構(gòu),但對(duì)樹形結(jié)構(gòu)的控制卻非常簡(jiǎn)單。
到了這里,關(guān)于設(shè)計(jì)模式之組合模式筆記的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!