结构型模式之组合模式
Posted yewen1234
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结构型模式之组合模式相关的知识,希望对你有一定的参考价值。
组合模式也叫合成模式,用来描述部分与整体的关系。
定义:
- 将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
组合模式类图如下所示。
组合模式提供以下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.
以上是关于结构型模式之组合模式的主要内容,如果未能解决你的问题,请参考以下文章