结构型模式之组合模式
程序员文章站
2023-04-03 13:10:14
组合模式也叫合成模式,用来描述部分与整体的关系。 定义: 将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。 组合模式类图如下所示。 组合模式提供以下3个角色: 抽象构件(Component)角色:定义参加组合对象的共有方法和属性,规范一些默认的行为接 ......
组合模式也叫合成模式,用来描述部分与整体的关系。
定义:
- 将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
组合模式类图如下所示。
组合模式提供以下3个角色:
- 抽象构件(component)角色:定义参加组合对象的共有方法和属性,规范一些默认的行为接口。
- 叶子结构(leaf)角色:叶子对象,其下没有其他的分支,定义出参加组合的原始对象的行为。
- 树枝构件(composite)角色:代表参加组合的、其下有分支的树枝对象,它的作用是将树枝和叶子组合成一个树形结构,并定义出管理子对象的方法,如add()、remove()等。
component.java
// 定义抽象构件接口 public interface component { public void operation(); }
composite.java
// 定义树枝构件 public class composite implements component { // 构件容器 private arraylist<component> componentlist = new arraylist<component>(); // 添加构件 public void add(component component) { this.componentlist.add(component); } // 删除构件 public void remove(component component) { this.componentlist.remove(component); } // 获取子构件 public arraylist<component> getchild() { return this.componentlist; } @override public void operation() { system.out.println("业务逻辑代码"); } }
leaf.java
// 定义叶子结构 public class leaf implements component { @override public void operation() { system.out.println("业务逻辑代码leaf"); } }
client.java
public class client { public static void main(string[] args) { // 创建根节点 composite root = new composite(); // 创建树枝节点 composite branch = new composite(); // 创建叶子节点 leaf leaf = new leaf(); root.add(branch); branch.add(leaf); display(root); } // 遍历树递归 public static void display(composite root) { for (component c : root.getchild()) { if (c instanceof leaf) { // 如果节点类型是叶子节点 c.operation(); } else { // 树枝节点 c.operation(); display((composite) c); } } } }
优点:
- 高层模块调用简单。树形结构中的所有节点都是component,局部和整体对调用者来说没有任何区别,即高层模块不必关心自己处理的是单个对象还是整个组合结构,简化了高层模块的代码。
- 节点*增加。使用组合模式后,如果想增加一个树枝节点,树叶节点只需要找到其父节点即可,
缺点:
- 不易控制树枝构件的类型。
- 不易使用新的方法来增加新的行为。
使用场景:
- 需要描述对象的部分和整体的等级结构,如树形菜单、文件和文件夹管理。
- 需要客户端忽略个体构件和组合构件的区别,平等对待所有的构件。
摘自:
青岛东合信息技术有限公司 . 设计模式(java版) . 电子工业出版社,2012,86-89.