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


    组合模式(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财务部公司收支管理

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

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

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

  • 相关阅读:
    matlab中的匹配函数
    查看matlab中的小波基
    图像处理中的彩色图像处理
    OSEK Event mechanism
    OSEK OS Resource management
    ISO17356标准简介[转]
    OSEK OS标准简介(转)
    IQmath的使用方法
    HIVERT高压变频主电路构造原理
    MPPT算法
  • 原文地址:https://www.cnblogs.com/hrlizhi/p/7891030.html
Copyright © 2020-2023  润新知