那王麻子自从做了肉夹馍生意后,真是风生水起,分店开的跟下饺子似的,没多久这分店经营就开遍全国了,一时半会儿连自己都数不过来开了哪些分店了,为了方便管理他在各个地区都设立了分公司。于是这期我们分享设计模式里的组合模式。
组合模式在处理复杂的树形结构操作中有他的独到的地方,对于树形结构层次简单,叶子有限的数据结构处理过程中,如果使用组合模式就有些卖艺之嫌。他的优点是简单有效、运算方式清晰明了。缺点是由于领域模型与业务处理紧紧耦合到一块,是典型的充血模型,代码的可维护性、可读性不强。因此,一般设计过程中,对组合模式的选择都是慎之又慎,谨慎采纳。
但是也不尽然,比如一些大部分的非业务型处理逻辑如磁盘扫描之类的功能,如果用其他的方式来实现,代码量会大幅增加,用组合模式会让人感觉代码简洁,结构清晰。
用类图来说明组合模式如下:
示例代码如下:
/**
*
*/
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://baike.baidu.com/link?url=Ya5mjVEkWCIknSlkYJX-FvXlPDNJmsB16m4-d1eXhOM5kMn0phNQ8xY_326Y5BgrDWj5MYW5lxnCvL_xZ-5kAP6P_ArKyMKKvVPNWorNvGmVpAxoXib9lpWyJlCqKhO7
http://blog.csdn.net/hfmbook/article/details/7693069