那王麻子自從做了肉夾饃生意後,真是風生水起,分店開的跟下餃子似的,沒多久這分店經營就開遍全國了,一時半會兒連自己都數不過來開了哪些分店了,爲了方便管理他在各個地區都設立了分公司。於是這期我們分享設計模式裏的組合模式。
組合模式在處理複雜的樹形結構操作中有他的獨到的地方,對於樹形結構層次簡單,葉子有限的數據結構處理過程中,如果使用組合模式就有些賣藝之嫌。他的優點是簡單有效、運算方式清晰明瞭。缺點是由於領域模型與業務處理緊緊耦合到一塊,是典型的充血模型,代碼的可維護性、可讀性不強。因此,一般設計過程中,對組合模式的選擇都是慎之又慎,謹慎採納。
但是也不盡然,比如一些大部分的非業務型處理邏輯如磁盤掃描之類的功能,如果用其他的方式來實現,代碼量會大幅增加,用組合模式會讓人感覺代碼簡潔,結構清晰。
用類圖來說明組合模式如下:
示例代碼如下:
/**
*
*/
package composite;
/**
*
* @author Administrator
* @version $Id: Department.java, v 0.1 2017年3月11日 下午4:38:56 Administrator Exp $
*/
public abstract class Department {
/** */
private String name;
/**
* default constructor
*/
public Department(String name) {
this.name = name;
}
/**
* default constructor
*/
public Department() {
}
/**
* 添加
*/
protected abstract void add(Department department);
/**
* 打印
*/
protected abstract void show(int depth);
/**
* Getter method for property <tt>name</tt>.
*
* @return property value of name
*/
public String getName() {
return name;
}
/**
* Setter method for property <tt>name</tt>.
*
* @param name value to be assigned to property name
*/
public void setName(String name) {
this.name = name;
}
}
/**
* Copyright (c) 2004-2017 All Rights Reserved.
*/
package composite;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author Administrator
* @version $Id: DinnerDepartment.java, v 0.1 2017年3月11日 下午4:45:50 Administrator Exp $
*/
public class DinnerDepartment extends Department {
/** */
private List<Department> deptList = new ArrayList<Department>();
public DinnerDepartment() {
}
public DinnerDepartment(String name) {
super(name);
}
/**
* @see composite.Department#add(composite.Department)
*/
@Override
protected void add(Department department) {
deptList.add(department);
}
/**
* @see composite.Department#show(int)
*/
@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.getName());
for (Department c : deptList) {
c.show(depth + 2);
}
}
}
/**
* Copyright (c) 2004-2017 All Rights Reserved.
*/
package composite;
/**
*
* @author Administrator
* @version $Id: HRDepartment.java, v 0.1 2017年3月11日 下午5:01:10 Administrator Exp $
*/
public class HRDepartment extends Department {
public HRDepartment() {
}
public HRDepartment(String name) {
super(name);
}
/**
* @see composite.Department#add(composite.Department)
*/
@Override
protected void add(Department department) {
}
/**
* @see composite.Department#show(int)
*/
@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.getName());
}
}
/**
* Copyright (c) 2004-2017 All Rights Reserved.
*/
package composite;
/**
*
* @author Administrator
* @version $Id: FinanceDepartment.java, v 0.1 2017年3月11日 下午5:02:42 Administrator Exp $
*/
public class FinanceDepartment extends Department {
public FinanceDepartment() {
}
public FinanceDepartment(String name) {
super(name);
}
/**
* @see composite.Department#add(composite.Department)
*/
@Override
protected void add(Department department) {
}
/**
* @see composite.Department#show(int)
*/
@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.getName());
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Department root = new DinnerDepartment();
root.setName("北京總公司");
root.add(new HRDepartment("總公司人力資源部"));
root.add(new FinanceDepartment("總公司財務部"));
Department shandongCom = new DinnerDepartment("山東分公司");
shandongCom.add(new HRDepartment("山東分公司人力資源部"));
shandongCom.add(new FinanceDepartment("山東分公司賬務部"));
Department zaozhuangCom = new DinnerDepartment("棗莊辦事處");
zaozhuangCom.add(new FinanceDepartment("棗莊辦事處財務部"));
zaozhuangCom.add(new HRDepartment("棗莊辦事處人力資源部"));
Department jinanCom = new DinnerDepartment("濟南辦事處");
jinanCom.add(new FinanceDepartment("濟南辦事處財務部"));
jinanCom.add(new HRDepartment("濟南辦事處人力資源部"));
shandongCom.add(jinanCom);
shandongCom.add(zaozhuangCom);
Department huadongCom = new DinnerDepartment("上海華東分公司");
huadongCom.add(new HRDepartment("上海華東分公司人力資源部"));
huadongCom.add(new FinanceDepartment("上海華東分公司賬務部"));
Department hangzhouCom = new DinnerDepartment("杭州辦事處");
hangzhouCom.add(new FinanceDepartment("杭州辦事處財務部"));
hangzhouCom.add(new HRDepartment("杭州辦事處人力資源部"));
Department nanjingCom = new DinnerDepartment("南京辦事處");
nanjingCom.add(new FinanceDepartment("南京辦事處財務部"));
nanjingCom.add(new HRDepartment("南京辦事處人力資源部"));
huadongCom.add(hangzhouCom);
huadongCom.add(nanjingCom);
root.add(shandongCom);
root.add(huadongCom);
root.show(12);
}
}
運行結果如下:
------------北京總公司
----------------------------總公司人力資源部
----------------------------總公司財務部
--------------山東分公司
--------------------------------山東分公司人力資源部
--------------------------------山東分公司賬務部
----------------濟南辦事處
------------------------------------濟南辦事處財務部
------------------------------------濟南辦事處人力資源部
----------------棗莊辦事處
------------------------------------棗莊辦事處財務部
------------------------------------棗莊辦事處人力資源部
--------------上海華東分公司
--------------------------------上海華東分公司人力資源部
--------------------------------上海華東分公司賬務部
----------------杭州辦事處
------------------------------------杭州辦事處財務部
------------------------------------杭州辦事處人力資源部
----------------南京辦事處
------------------------------------南京辦事處財務部
------------------------------------南京辦事處人力資源部
各位看官,原創不易啊,轉載請註明出處: http://danlley.iteye.com 看在打字不易的份上,打賞一個吧
參考文獻:
http://baike.baidu.com/link?url=Ya5mjVEkWCIknSlkYJX-FvXlPDNJmsB16m4-d1eXhOM5kMn0phNQ8xY_326Y5BgrDWj5MYW5lxnCvL_xZ-5kAP6P_ArKyMKKvVPNWorNvGmVpAxoXib9lpWyJlCqKhO7