组合模式
Posted lovebolin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了组合模式相关的知识,希望对你有一定的参考价值。
组合模式又叫合成模式,有时又叫整体-部分模式,主要用来描述整体和部分的关系,其定义为:将对象组合成树形结构以表示“整体-部分”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
先说说组合模式的几个角色:
- Component抽象构件角色:定义参加组合对象的共有方法和属性,也可以定义一些默认的行为或属性
- Leaf叶子构件:叶子对象,其下再没有分支,也就是遍历的最小单位
- Composite树枝构件:组合抽象构件和叶子构件形成一个树形结构
下面看一个通用代码示例:
//抽象构件 public abstract class Component{ //个体和整体都具有的共享 public void doSomething(){ } } //树枝构件,也是组合模式的重点 public class Composite extends Component{ //构件容器 private ArrayList<Component> componentArrayList = new ArrayList(); //增加一个叶子构件或树枝构件 public void add(Component conponent){ this.componentArrayList.add(conponent); } //删除一个叶子构件或树枝构件 public void remove(Component conponent){ this.componentArrayList.remove(conponent); } //获得分支下的所有叶子构件或树枝构件 public ArrayList<Component> getChild(){ return this.componentArrayList; } } //树叶构件 public class Leaf extends Component{ //可以选择性覆写父类方法 public void doSomething(){ } } //场景类 public class Client{ public static void main(String[] args){ Composite root = new Composite(); root.doSomething(); Composite branch = new Composite(); Leaf leaf = new Leaf(); //建立整体 root.add(branch); branch.add(leaf); } }
组合模式的优点:
- 高层模块调用简单。一颗树形结构中的所有节点都是Component,局部和整体对调用者来说没有任何区别,也就是说,高层模块不必关心自己处理的是单个对象还是整个组合结构,简化了高层模块的代码。
- 节点自由增加。使用了组合模式后,如果想增加一个树枝节点或叶子节点都是非常容易的,只要找到它的父节点就行,非常容易扩展。
组合模式的缺点:
- 树枝和叶子构件都直接使用了实现类,这在面向接口编程是不恰当的,也违背了依赖倒置原则。
使用场景:
- 维护部分-整体关系的场景,如树形菜单、文件和文件管理。
- 从一个整体中能够独立出部分模块或功能的场景。
注意事项:
只要是树形结构,就要考虑使用组合模式,只要是体现局部和整体关系的时候,而且关系还比较深,就要考虑使用组合模式。
以上是关于组合模式的主要内容,如果未能解决你的问题,请参考以下文章