结构型设计模式(三)组合模式
一、一句话背景
假如我要统计部门员工的情况,而员工有层级结构之分,那么可以把这整个部门的员工统一依据树形结构来组合成雇员对象。
二、使用场景
组合模式:就是在一个对象中包含其他对象,这些被包含的对象可能是终点对象(不再包含别的对象),也有可能是
非终点对象(其内部还包含其他对象,或叫组对象),我们将对象称为节点,即一个根节点包含许多子节
点,这些子节点有的不再包含子节点,而有的仍然包含子节点,以此类推。
即:组合模式依据树形结构来组合对象,用来表示部分以及整体层次,使得一组相似的对象当作一个单一的对象。
如: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); } } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律