设计模式思考之 Composite 模式

148 阅读2分钟

这是我参与8月更文挑战的第27天,活动详情查看:8月更文挑战

Composite翻译过来就是合成、组合的意思。首先OOP的精髓在于抽象,给万事万物提供一个合理的抽象,把复杂简单化,把具象的业务映射成抽象的代码,这对企业大规模业务场景的开发和建模极其重要。而今天要说的组合模式则是这一种理念的实战。这个模式听起来就已经很抽象了,是怎么回事呢?先看下面一张图:

image.png

这是二叉树,没错,但也是组合模式的应用场景。首先来看这个树,A我们称之为根节点,B C我们称之为树支节点,DEF我们称之为叶子结点,由上而下的结构十分清晰。想象一下,如果以上3个分别属于3种不同的对象,那处理器二叉树的结构该多复杂。下面再看一张图:

image.png

这是一个目录树,包含2种对象:目录和文件。往往在Java中处理文件和目录的方法是比较重合的,你可以在File对象中传递一个目录或者文件,都是合法的。这就是组合模式的魅力所在,所有包含的结构中使用的对象都是同一种数据类型,它们具备一致的行为。在具备复杂的递归或者树形结构的问题中,让调用者可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,大大简化了代码和复杂程度。同时,在结构中新增对象调用者无需修改代码,满足“开闭原则”。

下面是组合模式的类图:

image.png

组合模式强调的是一致性,leaf和composite对象可以水平复制,但调用者处理一个和处理多个的代码不用改变,因为他们共同继承的是Component类,他们具备一致的行为。