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