设计模式之组合模式的学习思考

来源:互联网 发布:国外域名注册商性价比 编辑:程序博客网 时间:2024/06/05 19:23

组合模式(Compostite Pattern)是设计模式里的结构型模式一种。

它的结构类似于数据结构里的树形结构。

把一组对象通过容器类来存放,通过最外部的对象来逐渐的显示里面的对象。

优点:

  • 高层模块调用简单
  • 节点自由增加

缺点:

  • 使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。
  • 依赖倒置原则:这个原则是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。
  • 开闭原则:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类

    小例子:公司的组织结构可以用组合模式来表示;

代码:

import java.util.ArrayList;import java.util.List;class Employee{    private String name;    private String dept;    private int salary;    private List<Employee> subordinates;     Employee(String name,String dept,int salary){        this.name=name;        this.dept=dept;        this.salary=salary;        subordinates=new ArrayList<Employee>();    }    void add(Employee e){        subordinates.add(e);    }    void remove(Employee e){        subordinates.remove(e);    }    List<Employee> getSubordinates(){   //返回容器对象,是实现树形结构的基础        return subordinates;    }    public String toString(){        return ("Emplyee:[ Name:"+name+",dept:"+dept+",salary:"+salary+"]");    }}public class CompositePatternDemo {    public static void main(String[] args) {        Employee CEO=new Employee("李明","CEO",30000);        Employee headSales = new Employee("王一","Head Sales", 20000);        Employee headMarketing = new Employee("王二","Head Marketing", 20000);        Employee clerk1 = new Employee("孙一","Marketing", 10000);        Employee clerk2 = new Employee("孙二","Marketing", 10000);        Employee salesExecutive1 = new Employee("赵一","Sales", 10000);        Employee salesExecutive2 = new Employee("赵二","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);             }         }    }}

输出:

Emplyee:[ Name:李明,dept:CEO,salary:30000]Emplyee:[ Name:王一,dept:Head Sales,salary:20000]Emplyee:[ Name:赵一,dept:Sales,salary:10000]Emplyee:[ Name:赵二,dept:Sales,salary:10000]Emplyee:[ Name:王二,dept:Head Marketing,salary:20000]Emplyee:[ Name:孙一,dept:Marketing,salary:10000]Emplyee:[ Name:孙二,dept:Marketing,salary:10000]

注意点:

  • 重写了Objec的toString方法后,其实是打印语句的格式控制,打印语句直接打印对象。
原创粉丝点击