结构型模式-组合模式
组合模式
组合模式是将对象组合成树形结构以表示部分-整体的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
以公司员工举例:
如果要表示这样的树结构,就可以用到组合模式。
实现
首先抽象出每个员工的信息,拥有的信息都是名字、职位、薪水。
员工抽象类
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();
}
}
打印结果:
组合模式优点:
- 高层模块调用简单
- 自由增加节点
组合模式适用场景:
- 树形结构、文件、文件夹