zoukankan      html  css  js  c++  java
  • 结构型设计模式(三)组合模式

    一、一句话背景

    假如我要统计部门员工的情况,而员工有层级结构之分,那么可以把这整个部门的员工统一依据树形结构来组合成雇员对象。

    二、使用场景

    组合模式:就是在一个对象中包含其他对象,这些被包含的对象可能是终点对象(不再包含别的对象),也有可能是

           非终点对象(其内部还包含其他对象,或叫组对象),我们将对象称为节点,即一个根节点包含许多子节

         点,这些子节点有的不再包含子节点,而有的仍然包含子节点,以此类推。

           即:组合模式依据树形结构来组合对象,用来表示部分以及整体层次,使得一组相似的对象当作一个单一的对象。

    如:1.需要展示树型结构时。

      2.想表示对象的部分-整体层次结构(树形结构)时。

    三、模型分析

    员工类:组合模型类,内部存在一个List方法用于存放下级树。

    四、代码分析

    员工类

    /**
     * 员工类
     */
    public class Employee {
        private String name;
        private String dept;
        private int salary;
        //定义了一个list用于存放下级节点(下级节点中也存放的也是同类对象)
        private List<Employee> subordinates;
    
        //构造函数
        public Employee(String name, String dept, int sal) {
            this.name = name;
            this.dept = dept;
            this.salary = sal;
            subordinates = new ArrayList<Employee>();
        }
    
        public void add(Employee e) {
            subordinates.add(e);
        }
    
        public void remove(Employee e) {
            subordinates.remove(e);
        }
    
        public List<Employee> getSubordinates() {
            return subordinates;
        }
    
        public String toString() {
            return ("Employee :[ Name : " + name
                    + ", dept : " + dept + ", salary :"
                    + salary + " ]");
        }
    }

    模拟打印部门员工信息

    /**
     * 模拟打印部门员工信息
     * PS:虽然存在职位高低,但是都是员工,所以都用同一个类对象
     */
    public class CompositePatternDemo {
        public static void main(String[] args) {
            //大boss
            Employee CEO = new Employee("John", "CEO", 30000);
    
            //2级boss(销售头头)
            Employee headSales = new Employee("Robert", "Head Sales", 20000);
            //2级boss(市场头头)
            Employee headMarketing = new Employee("Michel", "Head Marketing", 20000);
    
            //3级雇员(销售经理)
            Employee salesExecutive1 = new Employee("Richard", "Sales", 10000);
            Employee salesExecutive2 = new Employee("Rob", "Sales", 10000);
            //3级雇员(业务员)
            Employee clerk1 = new Employee("Laura", "Marketing", 10000);
            Employee clerk2 = new Employee("Bob", "Marketing", 10000);
    
            //大boss的直属下属(销售头头、市场头头)
            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);
                }
            }
        }
    }
  • 相关阅读:
    教你解决Python爬虫的时候Xpath取值为空
    jmeter工具使用心得
    查找uipath项目中引用包的目录
    pandas 设置某列值的类型,求和指定列,给指定列赋值
    pandas 获取不符合条件/不包含某个字符串的dataframe
    Visual Studio清理最近項目和解決方案
    【vue BUG记录】作用域插槽
    银行下拉框数据
    as3.0对图片进行不规则切割源代码实例
    Vuforia+single image 问题
  • 原文地址:https://www.cnblogs.com/riches/p/11252630.html
Copyright © 2011-2022 走看看