标签:
将对象组合成树形结构以表示‘部分-整体‘的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
Component 是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component子部件。
Leaf 在组合中表示叶子结点对象,叶子结点没有子结点。
Composite 定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(add)和删除 (remove)等。
在一个公司里,有主公司,主公司下面又有办事处,形成了一个树状结构,而不论主公司还是办事处,都有自己独立的部门(节点)。
公司抽象类
package com.csdhsm.pattemdesign.composite; /** * @Title: Company.java * @Description: 公司类 抽象类或接口 * @author: Han * @date: 2016年6月26日 下午2:06:42 */ public abstract class Company { protected String name; public Company(String name) { this.name = name; } //增加 public abstract void add(Company c); //移除 public abstract void remove(Company c); //履行职责 public abstract void lineOfDuty(); //显示 public void display(int depth) { StringBuilder sb = new StringBuilder(); for(int i = 0; i < depth; i++) { sb.append(‘-‘); } System.out.println(sb.toString() + name); } }
具体公司类,树枝节点
package com.csdhsm.pattemdesign.composite; import java.util.ArrayList; import java.util.List; /** * @Title: ConcreteCompany.java * @Description: 具体公司类 实现接口 树枝节点 * @author: Han * @date: 2016年6月26日 下午2:14:04 */ public class ConcreteCompany extends Company { private List<Company> children = new ArrayList<>(); public ConcreteCompany(String name) { super(name); } @Override public void add(Company c) { children.add(c); } @Override public void remove(Company c) { children.remove(c); } @Override public void display(int depth) { super.display(depth); for (Company company : children) { company.display(depth + 2); } } @Override public void lineOfDuty() { for (Company company : children) { company.lineOfDuty(); } } }
两个叶子节点,不能继续向下延伸
package com.csdhsm.pattemdesign.composite; /** * @Title: HRDepartment.java * @Description: 人力资源部 叶子节点 * @author: Han * @date: 2016年6月26日 下午2:21:47 */ public class HRDepartment extends Company { public HRDepartment(String name) { super(name); } @Override public void add(Company c) { } @Override public void remove(Company c) { } @Override public void lineOfDuty() { System.out.println(name + " 员工招聘培训管理"); } }
package com.csdhsm.pattemdesign.composite; /** * @Title: FinanceDepartment.java * @Description: 财务部 叶子节点 * @author: Han * @date: 2016年6月26日 下午2:21:23 */ public class FinanceDepartment extends Company { public FinanceDepartment(String name) { super(name); } @Override public void add(Company c) { } @Override public void remove(Company c) { } @Override public void lineOfDuty() { System.out.println(name + " 公司财务收支管理"); } }
客户端
package com.csdhsm.pattemdesign.composite; public class Solution { public static void main(String[] args) { ConcreteCompany root = new ConcreteCompany("北京总公司"); root.add(new HRDepartment("总公司人力资源部")); root.add(new FinanceDepartment("总公司财务部")); ConcreteCompany comp = new ConcreteCompany("上海华东分公司"); comp.add(new HRDepartment("华东分公司人力资源部")); comp.add(new FinanceDepartment("华东分公司财务部")); root.add(comp); ConcreteCompany comp1 = new ConcreteCompany("南京办事处"); comp1.add(new HRDepartment("南京办事处人力资源部")); comp1.add(new FinanceDepartment("南京办事处财务部")); comp.add(comp1); ConcreteCompany comp2 = new ConcreteCompany("杭州办事处"); comp2.add(new HRDepartment("杭州办事处人力资源部")); comp2.add(new FinanceDepartment("杭州办事处财务部")); comp.add(comp2); System.out.println("结构图"); root.display(1); System.out.println("职责"); root.lineOfDuty(); } }
结果
OK,成功
Composite模式好处:
1.使客户端调用简单,客户端可以一致的使用组合结构或其中单个对象,用户就不必关系自己处理的是单个对象还是整个组合结构,这就简化了客户端代码。
2.更容易在组合体内加入对象部件. 客户端不必因为加入了新的对象部件而更改代码
Composite模式适用于:
当你发现需求重视体现部分与整体层次的结构时,以及希望用户可以忽略组合对象与单个对象的不同,同一地使用组合结构中的所有对象时,就应该考虑用组合模式了。
标签:
原文地址:http://www.cnblogs.com/a294098789/p/5617893.html