7.0 组合模式

简介

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。

这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。

我们通过下面的实例来演示组合模式的用法。实例演示了一个组织中员工的层次结构。

类图

代码

/**  
 * 组合模式
 * @author: 张彬
 * @date: 2018年5月22日 上午11:24:28
 * @version: V1.0
 * @review: 张彬/2018年5月22日 上午11:24:28
 */
public class Employee {
    private String name;
    private String dept;
    private int salary;
    private List<Employee> subordinates;

    //构造函数
    public Employee(String name,String dept, int sal) {
       this.name = name;
       this.dept = dept;
       this.salary = sal;
       subordinates = new ArrayList<Employee>();
    }

    public void add(Employee e) {
       subordinates.add(e);
    }

    public void remove(Employee e) {
       subordinates.remove(e);
    }

    public List<Employee> getSubordinates(){
      return subordinates;
    }

    public String toString(){
       return ("Employee :[ Name : "+ name 
       +", dept : "+ dept + ", salary :"
       + salary+" ]");
    }   
 }
/**  
 * 测试
 * @author: 张彬
 * @date: 2018年5月22日 上午11:25:53
 * @version: V1.0
 * @review: 张彬/2018年5月22日 上午11:25:53
 */
public class Client {
    public static void main(String[] args) {
       Employee CEO = new Employee("CEO","CEO", 30000);

       Employee headSales = new Employee("销售总监","Head Sales", 20000);

       Employee headMarketing = new Employee("市场总监","Head Marketing", 20000);

       Employee clerk1 = new Employee("市场调查员1","Marketing", 10000);
       Employee clerk2 = new Employee("市场调查员2","Marketing", 10000);

       Employee salesExecutive1 = new Employee("销售员1","Sales", 10000);
       Employee salesExecutive2 = new Employee("销售员2","Sales", 10000);

       CEO.add(headSales);
       CEO.add(headMarketing);

       headSales.add(salesExecutive1);
       headSales.add(salesExecutive2);

       headMarketing.add(clerk1);
       headMarketing.add(clerk2);

       //打印该组织的所有员工
       System.out.println(CEO); 
       for (Employee headEmployee : CEO.getSubordinates()) {
          System.out.println(headEmployee);
          for (Employee employee : headEmployee.getSubordinates()) {
             System.out.println(employee);
          }
       }        
    }
 }

输出结果:

Employee :[ Name : CEO, dept : CEO, salary :30000 ]
Employee :[ Name : 销售总监, dept : Head Sales, salary :20000 ]
Employee :[ Name : 销售员1, dept : Sales, salary :10000 ]
Employee :[ Name : 销售员2, dept : Sales, salary :10000 ]
Employee :[ Name : 市场总监, dept : Head Marketing, salary :20000 ]
Employee :[ Name : 市场调查员1, dept : Marketing, salary :10000 ]
Employee :[ Name : 市场调查员2, dept : Marketing, salary :10000 ]

总结

优点:1、高层模块调用简单。2、节点自由增加。

缺点:在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。

使用场景:部分、整体场景,如树形菜单,文件、文件夹的管理。













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值