博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

设计模式学习--组合模式

Posted on 2017-11-24 15:58  南国木棉  阅读(138)  评论(0编辑  收藏  举报

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

案例:一个系统,使得分公司的系统都具有总公司系统的功能。

代码结构图:

 

1:创建公司类的超类。

package CompositeModel;

/**
 * 公司类,抽象类或者接口
 * @author 我不是张英俊
 *
 */
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 Display(int depth);//显示
    public abstract void LineOfDuty();//履行职责
    
}

2:具体公司类。树枝节点

package CompositeModel;

import java.util.ArrayList;
import java.util.List;

/**
 * 具体公司类,实现接口,树枝节点
 * @author 我不是张英俊
 *
 */
public class ConcreteCompany extends Company {

    private List<Company> children=new ArrayList<Company>();
    
    public ConcreteCompany(String name){
        super(name);
    }

    @Override
    public void Add(Company c) {
        // TODO Auto-generated method stub
        children.add(c);
    }

    @Override
    public void Remove(Company c) {
        // TODO Auto-generated method stub
        children.remove(c);
    }

    @Override
    public void Display(int depth) {
        // TODO Auto-generated method stub
        char[] a={'-','-','-','-','-','-','-','-','-','-','-'};
        System.out.println(new String (a,0,depth)+name);
        for(Company c:children){
            c.Display(depth+2);
        }
    }

    @Override
    public void LineOfDuty() {
        // TODO Auto-generated method stub
        for(Company c:children){
            c.LineOfDuty();
        }
    }
    
    
    
    
}

3:人力资源部类 树叶节点。

package CompositeModel;

/**
 * 人力资源部
 * @author 我不是张英俊
 *
 */
public class HRDepartment extends Company {

    public HRDepartment(String name) {
        super(name);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void Add(Company c) {
        // TODO Auto-generated method stub

    }

    @Override
    public void Remove(Company c) {
        // TODO Auto-generated method stub

    }

    @Override
    public void Display(int depth) {
        // TODO Auto-generated method stub
        char[] a={'-','-','-','-','-','-','-','-','-','-','-'};
        System.out.println(new String (a,0,depth)+name);

    }

    @Override
    public void LineOfDuty() {
        // TODO Auto-generated method stub
        System.out.println(name+"员工招聘培训管理");
    }

}

4:财务部类

package CompositeModel;

public class FinanceDepartMent extends Company {

    public FinanceDepartMent(String name) {
        super(name);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void Add(Company c) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void Remove(Company c) {
        // TODO Auto-generated method stub

    }

    @Override
    public void Display(int depth) {
        // TODO Auto-generated method stub
        char[] a={'-','-','-','-','-','-','-','-','-','-','-'};
        System.out.println(new String (a,0,depth)+name);
    }

    @Override
    public void LineOfDuty() {
        // TODO Auto-generated method stub
        System.out.println(name+"公司收支管理");
    }

}

5:测试类。

package CompositeModel;

/**
 * 组合模式:将对象组合成树形结构以表示‘部分-整体’的层次结构。
 * 组合模式使得用户对单个对象和组合对象的使用具有一致性。
 * 
 * 
 * 案例模拟:总公司的系统,需要在各个分公司系统上都有总公司系统的功能。
 * @author 我不是张英俊
 *
 */
public class Test {

    public static void main(String[] args) {
        ConcreteCompany root=new ConcreteCompany("11111");
        root.Add(new HRDepartment("11111人力资源部"));
        root.Add(new FinanceDepartMent("11111财务部"));
        
        ConcreteCompany comp=new ConcreteCompany("22222分公司");
        comp.Add(new HRDepartment("22222人力资源部"));
        comp.Add(new FinanceDepartMent("22222财务部"));
        root.Add(comp);
        
        ConcreteCompany comp1=new ConcreteCompany("33333办事处");
        comp1.Add(new HRDepartment("33333人力资源部"));
        comp1.Add(new FinanceDepartMent("33333财务处"));
        comp.Add(comp1);
        
        ConcreteCompany comp2=new ConcreteCompany("44444办事处");
        comp2.Add(new HRDepartment("44444人力资源部"));
        comp2.Add(new FinanceDepartMent("44444财务部"));
        comp.Add(comp2);
        
        ConcreteCompany comp3=new ConcreteCompany("55555分公司");
        comp3.Add(new HRDepartment("55555人力资源部"));
        comp3.Add(new FinanceDepartMent("55555财务部"));
        root.Add(comp3);
        
        
        System.out.println("******结构图*******");
        root.Display(1);
        
        System.out.println("******职责图*******");
        root.LineOfDuty();

    }

}

7:控制台

******结构图*******
-11111
---11111人力资源部
---11111财务部
---22222分公司
-----22222人力资源部
-----22222财务部
-----33333办事处
-------33333人力资源部
-------33333财务处
-----44444办事处
-------44444人力资源部
-------44444财务部
---55555分公司
-----55555人力资源部
-----55555财务部
******职责图*******
11111人力资源部员工招聘培训管理
11111财务部公司收支管理
22222人力资源部员工招聘培训管理
22222财务部公司收支管理
33333人力资源部员工招聘培训管理
33333财务处公司收支管理
44444人力资源部员工招聘培训管理
44444财务部公司收支管理
55555人力资源部员工招聘培训管理
55555财务部公司收支管理

总结:组合模式,使用基本的对象,组合成复杂的对象,一级一级的。而这个组合 对象又可以被组合,不断递归。

组合模式让用户可以一直的使用组合结构和单个对象。

自我理解:定义超类,不同等级的可同时实现超类,面对的是同一个超类,并通过实现 超类的子类的不同,可以不断的组合所需要的。