组合模式
来源:互联网 发布:一句话 晚安 知乎 编辑:程序博客网 时间:2024/06/06 16:52
1、组合模式
组合多个对象形成一种树形结构,表示整体和部分的关系。比如文件目录树,有图像 文本文件 也有子文件夹
角色:
Component(抽象构件):所有子类共有行为的声明,客户端只要调用该接口或者抽象类中的方法就可以,不用关心具体的操作成员是节点还是叶子
Leaf(叶子)
Composite(容器):节点
2、例子 比如对总公司 各地分公司 部门,
/** * @Title: Run.java * @Package component * @Description:组合模式测试* @author LingLee * @date 2017年3月31日 上午9:48:28 * @version V1.0 */ package component;import java.util.ArrayList;import java.util.List;/** * * @Title: Company * @Description: 抽象构件 子类有子公司还有具体的部门,定义了子类的公共操作方法 */abstract class Company { private String name; public Company(String name) { this.name = name; } public Company() { } public String getName() { return name; } public void setName(String name) { this.name = name; } protected abstract void add(Company company); protected abstract void romove(Company company); protected abstract void display(int depth); } /** * * @Title: ConcreteCompany * @Description: 容器构件 具体子公司节点 */class ConcreteCompany extends Company { private List<Company> cList; //节点包含的信息 public ConcreteCompany() { cList = new ArrayList<Company>(); } public ConcreteCompany(String name) { super(name); cList = new ArrayList<Company>() ; } @Override protected void add(Company company) { cList.add(company); } @Override protected void display(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.getName()); for (Company c : cList) { c.display(depth + 2); } } @Override protected void romove(Company company) { cList.remove(company); } } /** * * @Title: FinanceDepartment * @Description: 叶子:具体部门 */class FinanceDepartment extends Company { public FinanceDepartment(){ } public FinanceDepartment(String name){ super(name); } @Override protected void add(Company company) { //叶子不能再添加节点 } @Override protected void display(int depth) { StringBuilder sb = new StringBuilder(""); for (int i = 0; i < depth; i++) { sb.append("-"); } System.out.println(new String(sb) + this.getName() ) ; } @Override protected void romove(Company company) { } } class HRDepartment extends Company { public HRDepartment(){ } public HRDepartment(String name){ super(name); } @Override protected void add(Company company) { } @Override protected void display(int depth) { StringBuilder sb = new StringBuilder(""); for (int i = 0; i < depth; i++) { sb.append("-"); } System.out.println(new String(sb) + this.getName() ) ; } @Override protected void romove(Company company) { } } /** * @Title: Run * @Description: TODO(用一句话描述该文件做什么) */public class Run { public static void main(String[] args) { // TODO Auto-generated method stub Company root = new ConcreteCompany(); root.setName("北京总公司"); root.add(new HRDepartment("总公司人力资源部")); root.add(new FinanceDepartment("总公司财务部")); Company shandongCom = new ConcreteCompany("山东分公司"); shandongCom.add(new HRDepartment("山东分公司人力资源部")); shandongCom.add(new FinanceDepartment("山东分公司账务部")); Company zaozhuangCom = new ConcreteCompany("枣庄办事处"); zaozhuangCom.add(new FinanceDepartment("枣庄办事处财务部")); zaozhuangCom.add(new HRDepartment("枣庄办事处人力资源部")); Company jinanCom = new ConcreteCompany("济南办事处"); jinanCom.add(new FinanceDepartment("济南办事处财务部")); jinanCom.add(new HRDepartment("济南办事处人力资源部")); shandongCom.add(jinanCom); shandongCom.add(zaozhuangCom); Company huadongCom = new ConcreteCompany("上海华东分公司"); huadongCom.add(new HRDepartment("上海华东分公司人力资源部")); huadongCom.add(new FinanceDepartment("上海华东分公司账务部")); Company hangzhouCom = new ConcreteCompany("杭州办事处"); hangzhouCom.add(new FinanceDepartment("杭州办事处财务部")); hangzhouCom.add(new HRDepartment("杭州办事处人力资源部")); Company nanjingCom = new ConcreteCompany("南京办事处"); nanjingCom.add(new FinanceDepartment("南京办事处财务部")); nanjingCom.add(new HRDepartment("南京办事处人力资源部")); huadongCom.add(hangzhouCom); huadongCom.add(nanjingCom); root.add(shandongCom); root.add(huadongCom); root.display(0); } }
北京总公司--总公司人力资源部--总公司财务部--山东分公司----山东分公司人力资源部----山东分公司账务部----济南办事处------济南办事处财务部------济南办事处人力资源部----枣庄办事处------枣庄办事处财务部------枣庄办事处人力资源部--上海华东分公司----上海华东分公司人力资源部----上海华东分公司账务部----杭州办事处------杭州办事处财务部------杭州办事处人力资源部----南京办事处------南京办事处财务部------南京办事处人力资源部
3、优点:
(1)体现了整体和部分的层次结构
(2)客户端不用在意Component操作的具体子类是叶子还是容器,都统一对待
(3)扩展和修改复合开闭原则
(4)组合模式为一种树形结构,可以对叶子或者容器的递归操作,容易实现
缺点:在添加新的成员时,比较麻烦,因为要依照容器的相关规则进行添加
4、使用场景:
具有整体部分层次结构的,客户端忽略整体部分差异要一致对待的,要处理一个树形结构
0 0
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- "Missing Push Notification Entitlement"警告-----以及解决方法
- 牛客网 剑指Offer,一些值得记住的小题(五)
- 垃圾回收之finalize()方法
- jsp内置对象
- centos的SSH远程连接服务慢的解决方法
- 组合模式
- 个人随笔 (转载)
- JVM原理简单分析
- 快速排序QuickSort(Java)
- 详解Hibernate Session & Transaction
- mkdir() php 创建目录失败
- 数据挖掘学习-准备篇-数据集
- Java 序列化的使用
- React 及相关可推荐的配套框架技术