设计模式-结构型模式之组合模式

107 阅读2分钟

结构型模式-组合模式

image.png

组合模式

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

以公司员工举例:

image.png

如果要表示这样的树结构,就可以用到组合模式。

实现

首先抽象出每个员工的信息,拥有的信息都是名字、职位、薪水。

员工抽象类

public abstract class Staff {  
  
    protected String name;  

    protected String position;  

    protected Integer salary;  

    public Staff(String name, String position, Integer salary) {  
        this.name = name;  
        this.position = position;  
        this.salary = salary;  
    }  

    public void addStaff(Staff staff){  

    }  
    abstract void display();  
}

基础员工

public class BaseStaff extends Staff{  
    public BaseStaff(String name, String position, Integer salary) {  
        super(name, position, salary);  
    }  

    @Override  
    public void display(){  
        System.out.println("姓名:"+name+","+"职位:"+position+",薪水:"+salary);  
    }  
}

管理层员工

public class ControllerStaff extends Staff{  
  
    List<Staff> staffList = new ArrayList<>();  

    public ControllerStaff(String name, String position, Integer salary) {  
        super(name, position, salary);  
    }  

    @Override  
    public void addStaff(Staff staff) {  
        staffList.add(staff);  
    }  

    @Override  
    void display() {  
        System.out.println("姓名:"+name+","+"职位:"+position+",薪水:"+salary);  
        for (Staff staff : staffList) {  
            staff.display();  
        }  
    }  
}

测试

public class Main {  
    public static void main(String[] args) {  
        Staff staff = new ControllerStaff("张三","总经理",50000);  

        Staff staff1 = new ControllerStaff("李思","研发部经理",40000);  
        Staff staff2 = new ControllerStaff("王武","销售部经理",40000);  
        Staff staff3 = new ControllerStaff("张云","财务部经理",40000);  

        Staff staff4 = new ControllerStaff("张虎","研发一组组长",30000);  
        Staff staff5 = new ControllerStaff("王二","研发二组组长",30000);  
        Staff staff6 = new ControllerStaff("赵四","销售一组组长",30000);  
        Staff staff7 = new ControllerStaff("李三","财务一组组长",30000);  

        Staff staff8 = new BaseStaff("员工A","员工",20000);  
        Staff staff9 = new BaseStaff("员工B","员工",20000);  
        Staff staff10 = new BaseStaff("员工C","员工",20000);  
        Staff staff11 = new BaseStaff("员工D","员工",20000);  
        Staff staff12 = new BaseStaff("员工E","员工",20000);  
        Staff staff13 = new BaseStaff("员工F","员工",20000);  

        staff.addStaff(staff1);  
        staff.addStaff(staff2);  
        staff.addStaff(staff3);  

        staff1.addStaff(staff4);  
        staff1.addStaff(staff5);  

        staff2.addStaff(staff6);  
        staff3.addStaff(staff7);  

        staff4.addStaff(staff8);  
        staff4.addStaff(staff9);  

        staff5.addStaff(staff10);  
        staff6.addStaff(staff11);  
        staff7.addStaff(staff12);  
        staff7.addStaff(staff13);  

        staff.display();  
    }  
}

打印结果:

image.png


组合模式优点:

  • 高层模块调用简单
  • 自由增加节点

组合模式适用场景:

  • 树形结构、文件、文件夹