zoukankan      html  css  js  c++  java
  • 【结构型模式】《大话设计模式》——读后感 (14)分公司=一部门?——组合模式

    组合模式:将对象组合成树形结构以表示“部分整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性【DP】

     Company:

    package com.sjmx.composite;
    
    public 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);
    
    }

    叶子节点:

    package com.sjmx.composite;
    
    public class LeafCompany extends Company {
    
        public LeafCompany() {
        }
    
        public LeafCompany(String name) {
            super(name);
        }
    
        @Override
        protected void add(Company company) {
    
        }
    
        @Override
        protected void romove(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());
    
        }
    
    }

    直属节点:

    package com.sjmx.composite;
    
    public 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) {}  
          
    }  

    树干节点:

    package com.sjmx.composite;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public 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) {  
            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 + 4);  
            }  
        }  
      
        @Override  
        protected void romove(Company company) {  
            cList.remove(company);  
        }  
    }  

    客户端:

    package com.sjmx.composite;
    
    public class Client {
        /** 
         * @param args 
         */  
        public static void main(String[] args) {  
            Company root = new ConcreteCompany();  
            root.setName("北京总公司");  
            root.add(new HRDepartment("总公司人力资源部"));  
            root.add(new ConcreteCompany("总公司财务部"));  
            
            Company shandongCom = new ConcreteCompany("山东分公司");  
            shandongCom.add(new HRDepartment("山东分公司人力资源部"));  
            shandongCom.add(new ConcreteCompany("山东分公司账务部"));  
            
            Company zaozhuangCom = new ConcreteCompany("枣庄办事处");  
            zaozhuangCom.add(new ConcreteCompany("枣庄办事处财务部"));  
            zaozhuangCom.add(new HRDepartment("枣庄办事处人力资源部"));  
            
            Company jinanCom = new ConcreteCompany("济南办事处");  
            jinanCom.add(new ConcreteCompany("济南办事处财务部"));  
            jinanCom.add(new HRDepartment("济南办事处人力资源部"));   
            
            shandongCom.add(jinanCom);  
            shandongCom.add(zaozhuangCom);  
            
            
            Company huadongCom = new ConcreteCompany("上海华东分公司");  
            huadongCom.add(new HRDepartment("上海华东分公司人力资源部"));  
            huadongCom.add(new ConcreteCompany("上海华东分公司账务部")); 
            
            Company hangzhouCom = new ConcreteCompany("杭州办事处");  
            hangzhouCom.add(new ConcreteCompany("杭州办事处财务部"));  
            hangzhouCom.add(new HRDepartment("杭州办事处人力资源部"));
            
            Company nanjingCom = new ConcreteCompany("南京办事处");  
            nanjingCom.add(new ConcreteCompany("南京办事处财务部"));  
            nanjingCom.add(new HRDepartment("南京办事处人力资源部")); 
            
            huadongCom.add(hangzhouCom);  
            huadongCom.add(nanjingCom); 
            
            root.add(shandongCom);  
            root.add(huadongCom);  
            
            
            root.display(0);  
        }  
    }

    运行结果:

    北京总公司
    ----总公司人力资源部
    ----总公司财务部
    ----山东分公司
    --------山东分公司人力资源部
    --------山东分公司账务部
    --------济南办事处
    ------------济南办事处财务部
    ------------济南办事处人力资源部
    --------枣庄办事处
    ------------枣庄办事处财务部
    ------------枣庄办事处人力资源部
    ----上海华东分公司
    --------上海华东分公司人力资源部
    --------上海华东分公司账务部
    --------杭州办事处
    ------------杭州办事处财务部
    ------------杭州办事处人力资源部
    --------南京办事处
    ------------南京办事处财务部
    ------------南京办事处人力资源部
  • 相关阅读:
    (原)在ubuntu 中安装 swi prolog 和 简单的使用
    (转) 新手入门:C/C++中的结构体
    (转) eclipse debug (调试) 学习心得
    flutter: 根视图、根元素与根渲染
    eggjs的参数校验模块egg-validate的使用和进一步定制化升级
    Vue源码中用到的工具函数
    21 项优化 React App 性能的技术
    react-redux 的使用
    编写 Vue.js 组件前需要知道的 10 件事
    Flutter实现抽屉动画效果
  • 原文地址:https://www.cnblogs.com/chen1-kerr/p/7197889.html
Copyright © 2011-2022 走看看