组合模式

来源:互联网 发布:一句话 晚安 知乎 编辑:程序博客网 时间: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
原创粉丝点击