大连建设主管部门网站,做翻译网站 知乎,中国企业网,常见网站攻击方式在现实生活中#xff0c;常常会遇到用树形结构组织的一些场景#xff0c;比如国家省市#xff0c;学校班级#xff0c;文件目录#xff0c;分级导航菜单#xff0c;以及典型的公司组织架构#xff0c;整个层次结构自顶向下呈现一颗倒置的树。这种树形结构在面向对象的世…在现实生活中常常会遇到用树形结构组织的一些场景比如国家省市学校班级文件目录分级导航菜单以及典型的公司组织架构整个层次结构自顶向下呈现一颗倒置的树。这种树形结构在面向对象的世界中非常适合用组合模式来处理。
一概述
组合模式Composite Pattern又叫做“部分-整体”模式是一种结构型设计模式它允许将对象组织成树状结构以表示“部分-整体”的层次结构。在这种结构中可以将相同操作应用于部分和整体从而实现对单个对象和组合对象的一致性处理。怎么理解单个对象和组合对象比如一颗倒置的节点树其中的叶子节点就是单个对象每个分支节点和其下的所有子节点共同构成组合对象。
组合模式一般包含以下角色
抽象构件Component为单个对象和组合对象声明公共接口定义共有的行为或属性如添加、删除、获取子节点等方法。叶子构件Leaf即单个的对象表示树形结构中没有子节点的对象实现了抽象构件中的方法。组合构件Composite即组合对象包含一组子对象同时实现了抽象构件中添加、删除、获取子节点等方法。 优点
提供统一的操作接口简化客户端代码客户端代码可以一致地处理单个对象和组合对象无需区分它们的类型使客户端代码更加简洁和统一。提升系统灵活性和可扩展性可以很方便地通过添加新的组合对象或叶子对象来扩展树形结构并且可以动态地添加、删除和修改对象。
缺点
限制了组合对象的类型组合模式中的组合对象必须实现相同的接口或继承相同的父类。这可能会限制组合对象的类型使其无法满足特定的需求。可能导致系统过于一般化组合模式的使用可能导致系统过于一般化将特定的操作和行为放在组合模式中可能不太合适。增加了系统的复杂性引入组合模式会增加系统的复杂性需要更多的类和接口来表示组合结构增加了代码的数量和理解难度。
适用场景
需要表示“部分-整体”层次结构的情况如树状结构、目录结构等。希望能够以统一的方式处理单个对象和组合对象时。需要动态地添加、删除和修改对象希望系统具有良好的扩展性时。
二模拟公司组织架构
案例分析
接下来我们用组合模式来模拟实现下公司组织架构使得我们可以动态管理公司人员。如上图所示所有的叶子节点表示普通员工是单个的对象。所有的分支节点包括根节点表示领导每个领导都含有下属员工总裁的下属就是主管每个领导及其直接下属就构成组合对象。不管是总裁、主管还是普通员工他们都是公司的雇员这就是员工和领导的共性。
代码实现
步骤1创建抽象构件—Employee接口表示雇员。
public interface Employee {//添加下属员工void add(Employee e);//移除下属员工void remove(Employee e);//获取所有下属员工ListEmployee getSubordinates();//打印员工信息void info();
}步骤2创建叶子构件—Worker类实现Employee接口表示最底层的员工。对于的员工的管理操作提供空实现即可。
public class Worker implements Employee{//员工姓名private String name;public Worker(String name) {this.name name;}Overridepublic void add(Employee e) {}Overridepublic void remove(Employee e) {}Overridepublic ListEmployee getSubordinates() {return null;}Overridepublic void info() {System.out.println(员工-name);}
}步骤3创建组合构件—Leader类实现Employee接口表示含有下属的领导。代码中用一个集合表示该领导的下属。
public class Leader implements Employee{//领导姓名private String name;//下属集合private ListEmployee subordinates;public Leader(String name) {this.name name;this.subordinates new ArrayList();}Overridepublic void add(Employee e) {subordinates.add(e);}Overridepublic void remove(Employee e) {subordinates.remove(e);}Overridepublic ListEmployee getSubordinates() {return subordinates;}Overridepublic void info() {System.out.println(领导-name);for(Employee e:subordinates){e.info();}}
}步骤4客户端测试。
public class Client {public static void main(String[] args) {Employee ceonew Leader(ceo);Employee devLeadernew Leader(devLeader);Employee fatLeadernew Leader(fatLeader);ceo.add(devLeader);ceo.add(fatLeader);Employee devWorker01new Worker(devWorker01);Employee devWorker02new Worker(devWorder02);devLeader.add(devWorker01);devLeader.add(devWorker02);Employee fatWorker01new Worker(fatWorker01);Employee fatWorker02new Worker(fatWorder02);fatLeader.add(fatWorker01);fatLeader.add(fatWorker02);//打印整个公司架构ceo.info();System.out.println();//打印开发部门架构devLeader.info();System.out.println();//测试部门开除员工fatWorker01后的人员结构fatLeader.remove(fatWorker01);fatLeader.info();}
}测试结果 三总结
通过本篇文章的案例学习可以看出组合模式在处理树状结构场景时非常有用。在实际项目中如果遇到需要表示对象的“部分-整体”关系并希望用户能够忽略组合对象和单个对象之间的差异可以考虑使用组合模式。它可以简化客户端操作并提升系统灵活性和扩展性。不过它也可能增加系统的复杂度和理解难度我们应该根据实际需求进行权衡。
好了希望这篇文章对你的学习有所帮助在此感谢你的阅读我们下次再见