設計模式_組合模式(Java)

組合模式(Composite),將對象組合成樹形結構以表示“部分-整體”的層次結構。組合模式使得用戶對單個對象和組合對象的使用具有一致性。

使用時機:需求中是體現部分與整體層次的結構時,以及你希望用戶可以忽略組合對象與單個對象的不同,統一地使用組合結構中的所有對象時,就應該考慮用組合模式了。

組合模式基本對象可以被組合成更復雜的組合對象,而這個組合對象又可以被組合,這樣不斷地遞歸下去,客戶代碼中,任何用到基本對象的地方都可以使用組合對象了。

類圖:

組合模式

根據類圖結合公司的例子,將實例代碼放出:

//package com.dlut.designpattern.composite;

import java.util.ArrayList;
import java.util.List;

public abstract class Company {
    public String name;
    public Company(){
    }
    public Company(String name){
        this.name=name;
    }
    public abstract void add(Company c);
    public abstract void remove(Company c);
    public abstract void eachChild();
    public String toString() {
        return "Company [name=" + name + "]";
    }
}

class ConcreteCompany extends Company{
    List<Company> lists=new ArrayList<Company>();
    public ConcreteCompany(){}
    public ConcreteCompany(String name) {
        super(name);
    }
    @Override
    public void add(Company c) {
        lists.add(c);
    }
    @Override
    public void remove(Company c) {
        lists.remove(c);
    }
    @Override
    /**
     * 注意此處的用法,看不懂的童鞋請仔細分析
     */
    public void eachChild() {
        System.out.println(this);
        for(Company c:lists){
            c.eachChild();
        }
    }
}

class LeafCompany extends Company{
    public LeafCompany(){}
    public LeafCompany(String name){
        super(name);
    }
    @Override
    public void add(Company c) {
    }
    @Override
    public void remove(Company c) {
    }
    @Override
    public void eachChild() {
        System.out.println(this);
    }
}

測試類:

//package com.dlut.designpattern.composite;

public class Test {
    public static void main(String[] args) {
        Company root=new ConcreteCompany("總公司");
        root.add(new LeafCompany("大連辦事處"));

        Company bj=new ConcreteCompany("北京分公司");
        bj.add(new LeafCompany("朝陽辦事處"));

        root.add(bj);
        root.eachChild();
    }
}

先別看答案,仔細想想執行結果。

Company [name=總公司]
Company [name=大連辦事處]
Company [name=北京分公司]
Company [name=朝陽辦事處]

想想是哪句起了關鍵作用?是不是for(Company c:lists){c.eachChild();}這句 ?

參考:

發佈了52 篇原創文章 · 獲贊 35 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章