1. 程式人生 > >JAVA設計模式:組合模式

JAVA設計模式:組合模式

層次結構 lines end fadein java trac 抽象類 ddc 單個

組合(總體與部分關系)模式:將不同可是相關的對象組合成樹形結構以實現“部分-總體”的層次結構,使得用戶對單個對象和組合對象的使用具有一致性。
* 模式角色組成:
* 1.Component對象: 是組合中的對象接口,是全部類共同擁有的接口。是用於統一定義總體中的部分。
2.Leaf對象: 總體中的部分,沒有下一級。
3.Composite對象: 用來存儲子部件。在Component接口中實現與部分有關操作。


以公司構成為例,比方公司有總公司。總公司下有分公司,分公司下有辦事處等。構成一個樹形結構。

/**
 * 抽象類:用來管理子類
 * @description
: * @date 2016-1-22 下午1:16:25 */
public abstract class Firm { private String firmName;// 公司名稱 public Firm(String firmName) { this.firmName = firmName; } public String getFirmName() { return firmName; } public void setFirmName(String name) { this.firmName = name; } protected
abstract void append(Firm firm);// 加入公司如:新增分公司 protected abstract void romove(Firm firm);// 刪除公司:如因故關閉分公司 protected abstract void show(int level);//顯示公司所在的層級:總公司,分公司,辦事處等 }
/**
 * 分公司對象
 * @description:
 * @date 2016-1-22 下午1:25:43
 */
public class BranchFirm extends Firm {
    private List<Firm> cList;

    public
BranchFirm(String name) { super(name); cList = new ArrayList<Firm>(); } @Override protected void append(Firm firm) { cList.add(firm); } @Override protected void show(int depth) { StringBuilder sb = new StringBuilder(""); for (int i = 0; i < depth; i++) { sb.append("*"); } System.out.println(new String(sb) + this.getFirmName()); for (Firm c : cList) { c.show(depth + 2); } } @Override protected void romove(Firm firm) { // TODO Auto-generated method stub cList.remove(firm); } }
/**
 * Leaf結點類:公司市場部
 * @description:
 * @date 2016-1-22 下午1:46:02
 */
public class MarketDepartment extends Firm {
    public MarketDepartment(String name) {
        super(name);
    }

    @Override
    protected void append(Firm company) {
    }

    @Override
    protected void show(int depth) {
        // TODO Auto-generated method stub
        StringBuilder sb = new StringBuilder("");
        for (int i = 0; i < depth; i++) {
            sb.append("*");
        }
        System.out.println(new String(sb) + this.getFirmName());
    }

    @Override
    protected void romove(Firm company) {
    }
}
/**
 * Leaf結點類:公司技術部
 * @description:
 * @date 2016-1-22 下午1:21:41
 */
public class MinTechDepartment extends Firm {
    public MinTechDepartment(String name) {
        super(name);
    }

    @Override
    protected void append(Firm firm) {
    }

    @Override
    protected void show(int depth) {
        StringBuilder sb = new StringBuilder("");
        for (int i = 0; i < depth; i++) {
            sb.append("*");
        }
        System.out.println(new String(sb) + this.getFirmName());
    }

    @Override
    protected void romove(Firm company) {
    }
}
public class Test {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Firm head = new BranchFirm("深圳XX集團有限公司");// 公司總部
        head.append(new MarketDepartment("深圳XX集團有限公司--市場部"));
        head.append(new MinTechDepartment("深圳XX集團有限公司--技術部"));
        Firm jsFirm = new BranchFirm("深圳XX集團有限公司-江蘇分公司");
        jsFirm.append(new MarketDepartment("深圳XX集團有限公司-江蘇分公司市場部"));
        jsFirm.append(new MinTechDepartment("深圳XX集團有限公司-江蘇分公司技術部"));
        Firm szFirm = new BranchFirm("深圳XX集團有限公司-江蘇分公司-蘇州辦事處");
        szFirm.append(new MinTechDepartment("深圳XX集團有限公司-江蘇分公司-蘇州辦事處技術部"));
        szFirm.append(new MarketDepartment("深圳XX集團有限公司-江蘇分公司-蘇州辦事處市場部"));
        jsFirm.append(szFirm);
        // 假設還須要新增分公司或辦事處等。就依照第19-25行操作
        head.append(jsFirm);
        head.show(0);
    }
}
通常:在須要表示對象的總體與部分層次結構或須要忽略組合的總體對象與部分對象的不同,統一地使用總體中的部門情況下來使用組合模式。

JAVA設計模式:組合模式