组合模式

简介

组合模式也叫做部分整体模式,它将一组相似的对象看作一个对象处理,并且根据一个树状结构来组合对象,然后提供一个统一的方法去访问相应的对象,以此忽略对象与对象集合之间的差别。

定义

允许你将对象组成树形结构来表现“整体/部分”的层次结构。组合能让客户以一致的方式来处理个别对象和对象组合。

使用场景

表示对象的部分-整体层次结构,文件夹和文件层次,公司组织结构层次等树形结构的处理。

UML类图

安全组合模式


这里写图片描述

角色介绍:

  • Component:抽象构件,它可以是接口或抽象类,为下面的叶子构件和容器构件对象声明接口。包含所有子类共有的行为和声明的实现。
  • Leaf:叶子构件,叶子节点对象。没有子节点,它实现了抽象构件中的行为。对于管理子构件的方法,可以通过异常等进行处理。
  • Composite:容器构件,它表示容器节点对象,容器节点包含子节点。子节点可以是容器也可以是叶子。它实现了抽象构件中定义的行为和管理子构件的方法。

上述的抽象方法只声明了操作方法operation,叶子节点功能上面来说只要在意行为的方法operation,而容器节点要实现方法和管理子节点方法,这样保证了使用叶子节点的时候的安全性,不会涉及到其他和功能不想干的方法。
弊端:从面向接口编程来说,与依赖倒置原则相违背,我们不能使叶子节点和容器节点都使用抽象构件来定义。容器构件不能使用抽象构件来定义,否则都不能管理叶子节点了。

透明组合模式


这里写图片描述

这种实现组合模式我们可以看到抽象叶子和容器节点都实现了抽象构件的方法,可以通过接口编程。但是坏处我们很容易看到,叶子节点实现了不必要的add,remove,getChild方法。叶子节点实现那三个方法就抛出异常。

简单实现

我们以透明组合模式来实现打印文件名功能。
查看

Android源码使用组合模式

Android 的View和ViewGroup是我们接触最多的了,View好比抽象组件,具体实现子类为叶子组件,ViewGroup为容器组件。


这里写图片描述

总结

  • 优点:

    • 可以清楚的定义分层次的复杂对象,表示对象的全部或部分层次,它让客户端忽略了层次的差异,方便对整个层次结构进行控制。
    • 客户端可以一致地使用一个组合结构或其中单个对象,不必关心处理的是单个对象还是整个组合结构,简化了客户端代码。
    • 在组合模式中增加新的容器构件和叶子构件都很方便,无须对现有类库进行任何修改,符合“开闭原则”。
    • 组合模式为树形结构的面向对象实现提供了一种灵活的解决方案,通过叶子对象和容器对象的递归组合,可以形成复杂的树形结构,但对树形结构的控制却非常简单。
  • 缺点:

    • 在增加新构件时很难对容器中的构件类型进行限制。有时候我们希望一个容器中只能有某些特定类型的对象,例如在某个文件夹中只能包含文本文件,使用组合模式时,不能依赖类型系统来施加这些约束,因为它们都来自于相同的抽象层,在这种情况下,必须通过在运行时进行类型检查来实现,这个实现过程较为复杂。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章