java設(shè)計模式08(組合模式)

組合模式用于組合多個對象形成樹形結(jié)構(gòu)以表示具有部分-整體關(guān)系的層次結(jié)構(gòu)。組合模式讓客戶端可以統(tǒng)一對待單個對象和組合對象。組合模式又可以稱為“部分-整體”模式,是一種對象結(jié)構(gòu)型模式。

組合模式使用面向?qū)ο蟮乃枷雭韺崿F(xiàn)樹形結(jié)構(gòu)的構(gòu)建與處理,描述了如何將容器對象和葉子對象進行遞歸組合,實現(xiàn)簡單,靈活性好。

組合模式的結(jié)構(gòu)與實現(xiàn):
1.Component(抽象構(gòu)件):可以為抽象類或接口,為葉子構(gòu)件和容器構(gòu)件對象聲明接口,在該角色中可以包含所有子類共有行為的聲明。在抽象構(gòu)件中定義了訪問及管理它的子構(gòu)件的方法,如增加子構(gòu)件,刪除子構(gòu)件,獲取子構(gòu)件等。

public abstract class Component {

    public abstract void add(Component component);
    
    public abstract void remove(Component component);
    
    public abstract Component getChild(int node);
    
    public abstract void operation();
}

2.Composite(容器構(gòu)件):它在組合結(jié)構(gòu)中表示容器結(jié)點對象,容器結(jié)點包含子節(jié)點,其子結(jié)點可以是葉子結(jié)點,也可以是容器結(jié)點,它提供一個集合用于儲存子結(jié)點,實現(xiàn)了抽象構(gòu)件中定義的行為,包括那些訪問及管理子構(gòu)件的方法,在其業(yè)務(wù)方法中可以遞歸調(diào)用子結(jié)點的業(yè)務(wù)方法。

public class Composite extends Component {
    
    private List<Component> list=new ArrayList<>();
    
    private String text;
    
    public Composite(String text) {
        this.text=text;
    }

    @Override
    public void add(Component component) {
        list.add(component);
    }

    @Override
    public void remove(Component component) {
        list.remove(component);
    }

    @Override
    public Component getChild(int node) {
        return list.get(node);
    }

    @Override
    public void operation() {
        System.out.println("獲取到構(gòu)件內(nèi)容:"+text);
        //遞歸調(diào)用構(gòu)件的方法
        for (Component component : list) {
            component.operation();
        }
    }

}

3.Leaf(葉子構(gòu)件):他在組合結(jié)構(gòu)中表示葉子結(jié)點對象,葉子結(jié)點沒有子節(jié)點,它實現(xiàn)了在抽象構(gòu)件中定義的行為。對于那些訪問及管理子構(gòu)件的方法,可以通過拋出異常,提示錯誤等方式處理。

public class Leaf extends Component {
    
    private String text;
    
    public Leaf(String text) {
        this.text=text;
    }

    @Override
    public void add(Component component) {
        // 錯誤提示
    }

    @Override
    public void remove(Component component) {
        // 錯誤提示
    }

    @Override
    public Component getChild(int node) {
        // 錯誤提示
        return null;
    }

    @Override
    public void operation() {
        //葉子構(gòu)件具體業(yè)務(wù)方法的實現(xiàn)
        System.out.println("獲取到葉子結(jié)點內(nèi)容:"+text);
    }

}
  1. Test:
public class Test {
    
    public static void main(String[] args) {
        Component component1,component2;
        component1=new Composite("component1");
        component2=new Composite("component2");
        
        Component leaf1,leaf2,leaf3,leaf4;
        leaf1=new Leaf("component1+leaf1");
        leaf2=new Leaf("component1+leaf2");
        leaf3=new Leaf("component2+leaf3");
        leaf4=new Leaf("component2+leaf4");
        
        component1.add(leaf1);
        component1.add(leaf2);
        component2.add(leaf3);
        component2.add(leaf4);
        
        component1.operation();
        component2.operation();
    }

}

運行內(nèi)容:

獲取到構(gòu)件內(nèi)容:component1
獲取到葉子結(jié)點內(nèi)容:component1+leaf1
獲取到葉子結(jié)點內(nèi)容:component1+leaf2
獲取到構(gòu)件內(nèi)容:component2
獲取到葉子結(jié)點內(nèi)容:component2+leaf3
獲取到葉子結(jié)點內(nèi)容:component2+leaf4
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容