JAVA設計模式之組合模式原理與用法詳解
本文實例講述了JAVA設計模式之組合模式。分享給大家供大家參考,具體如下:
組合(整體與部分關系)模式:將不同但是相關的對象組合成樹形結構以實現(xiàn)“部分-整體”的層次結構,使得用戶對單個對象和組合對象的使用具有一致性。
* 模式角色組成:
1.Component對象: 是組合中的對象接口,是所有類共有的接口。是用于統(tǒng)一定義整體中的部分。
2.Leaf對象: 整體中的部分,沒有下一級。
3.Composite對象: 用來存儲子部件,在Component接口中實現(xiàn)與部分有關操作。
以公司構成為例,比如公司有總公司,總公司下有分公司,分公司下有辦事處等。構成一個樹形結構。
/**
* 抽象類:用來管理子類
* @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);
// 如果還需要新增分公司或辦事處等,就繼續(xù)按照上述操作處理
head.append(jsFirm);
head.show(0);
}
}
通常:在需要表示對象的整體與部分層次結構或需要忽略組合的整體對象與部分對象的不同,統(tǒng)一地使用整體中的部門情況下來使用組合模式。
更多java相關內容感興趣的讀者可查看本站專題:《Java數據結構與算法教程》、《Java操作DOM節(jié)點技巧總結》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設計有所幫助。
相關文章
SpringBoot整合MyBatis實現(xiàn)樂觀鎖和悲觀鎖的示例
這篇文章主要介紹了SpringBoot整合MyBatis實現(xiàn)樂觀鎖和悲觀鎖的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-09-09

