当前位置: 首页 > 图灵资讯 > 技术篇> 组合模式深度解析

组合模式深度解析

来源:图灵教育
时间:2021-12-31 13:13:04

  组合模式我们经常说到,实际上就是允许你把一个对象组合成树结构,以表示“整体/局部”层次。文章将从复合模式的定义、包含角色、通用源码及优缺点等几个方面进行详细分析,帮助您深入理解Java设计模式的组合模式。

复合图案分析。

  一、组合模式定义。

  它是一种常见的设计模式(但是我觉得有一点复杂)也被称为合成模式,有时也称为部分-整体模式,主要用于描述各部分和整体之间的关系。合成方式是把零件组装成一个整体。把物体组合成树结构来代表“部分-整体”的层次结构,这样用户就可以在单一对象和组合对象上保持一致。

  二,复合模式的内含角色:

  (1)组件抽象工件角色。

  用普通的方法和属性来定义参加复合的对象,可以定义某些缺省行为。

  (2)Leaf叶组件。

  叶对象,在它下面不再有分支,即遍历中最小的单元。

  (3)Composite树枝构件。

  枝条对象,作用是将枝条节点与叶子节点结合成一个树结构。

三、通用源代码:

  (1)抽象构件

  public abstract class Component {

  //个体和整体都具有的共享

  public void doSomething(){

  //编写业务逻辑

  }

  }

  (2)树枝构件

  public class Composite extends Component {

  //构件容器

  private ArrayList componentArrayList = new ArrayList()

  //增加一个叶子构件或树枝构件

  public void add(Component component){

  this.componentArrayList.add(component);

  }

  //删除一个叶子构件或树枝构件

  public void remove(Component component){

  this.componentArrayList.remove(component);

  }

  //获得分支下的所有叶子构件和树枝构件

  public ArrayList getChildren(){

  return this.componentArrayList;

  }

  }

  树叶节点是没有子下级对象的对象,定义参加组合的原始对象行为。

  (3)树叶构件

  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);

  }

  //通过递归遍历树

  public static void display(Composite root){

  for(Component c:root.getChildren()){

  if(c instanceof Leaf){ //叶子节点

  c.doSomething();

  }else{ //树枝节点

  display((Composite)c);

  }

  }

  }

  }

  四、组合模式的好处:

  (1)较高的模块调用。

  树形机构中的所有节点都是组件,而本地和全局对于调用方并无差别,即,高层模块无需关心自己是处理单一对象还是整个组合结构,从而简化高层模块的代码。

  (2)增加节点的自由。

  在采用组合方式之后,我们可以看到,如果想要增加一个枝条节点,是否都很简单,只要找到其父节点即可,非常容易扩展,符合开闭原理,非常有利于以后的维护。

  五、组合模式的缺点:

  在场景类中,组合模式还有一个很明显的缺点,那就是如何定义场景类中的叶子和枝条的定义?实现类,直接使用!这种方法不适合于面向界面的编程,与依赖倒置原则相冲突,读者在使用时要考虑清楚,它限制了界面的影响力。

  使用场景:

  (1)维护并呈现“局部-整体”的关系,比如树式菜单、文件和文件夹管理。

  (2)方案可以从整体中分离出部分模块或功能。

  简单地说,组合方式能充分体现局部与整体关系,既有优点也有不足之处,但总体上还是非常方便实用的。大家都搞明白了上面对组合模式的深度解析吗?