码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式(19)-----组合模式

时间:2016-06-26 15:26:13      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:

组合模式(Composite)

定义

  将对象组合成树形结构以表示‘部分-整体‘的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

UML类图

  技术分享

成员

  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模式适用于:

      当你发现需求重视体现部分与整体层次的结构时,以及希望用户可以忽略组合对象与单个对象的不同,同一地使用组合结构中的所有对象时,就应该考虑用组合模式了。

设计模式(19)-----组合模式

标签:

原文地址:http://www.cnblogs.com/a294098789/p/5617893.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!