目的
它属于structural 设计模式目录。将对象组合成树结构以表示部分整体层次结构。Composite允许客户端统一处理单个对象和对象组合。
解释
现实世界的例子
每个句子都由单词组成,而单词又由字符组成。这些对象中的每一个都是可打印的,并且它们可以在它们之前或之后打印一些东西,例如句子总是以句号结束并且字总是在它之前有空格。
简单来说
复合模式允许客户以统一的方式处理单个对象。
维基百科说
在软件工程中,复合模式是一种分区设计模式。复合模式描述一组对象将以与单个对象实例相同的方式进行处理。组合的目的是将对象“组合”到树结构中,以表示 部分— 整体 层次结构。通过实现复合模式,客户可以统一处理单个对象和组合。
结构
参与者
1.组件Component
- 声明组合中对象的接口。
- 根据需要,为所有类共有的接口实现默认行为。
- 声明用于访问和管理其子组件的接口。
- (可选)在递归结构中定义用于访问组件父级的接口,并在适当的情况下实现它。。
2.叶子 Leaf
- 表示组合中的叶子对象。叶子没有子类。
- 定义合成中基本对象的行为。
3.组合Composite
- 定义具有子项的组件的行为。
- 存储子组件。
- 在Component接口中实现与子相关的操作。
4.客户端Client
- 通过Component 接口操作组合中的对象 。
合作
- 客户端使用Component类接口与组合结构中的对象进行交互。如果收件人是Leaf,则直接处理请求。如果收件人是Composite,则它通常将请求转发给其子组件,可能在转发之前和/或之后执行其他操作。
源代码(示例1)
以我们上面的句子为例。这里有基类和不同的可打印类型
public abstract class LetterComposite { |
然后我们有一个信使来传递信息
public class Messenger { |
然后它可以用作
LetterComposite orcMessage = new Messenger().messageFromOrcs(); |
源代码(例2)
步骤1: 创建 将被视为组件Component的 Employee 接口 。
/ this is the Employee interface i.e. Component. |
第2步: 创建一个 将被视为Composite 的 BankManager 类, 并实现Employee接口。
// this is the BankManager class i.e. Composite. |
第3步: 创建一个 将被视为叶子leaf 的 Cashier 类, 它将实现到Employee接口。
public class Cashier implements Employee{ |
第4步: 创建一个 Accountant 类,它也将被视为一个 leaf,它将实现到Employee接口。
public class Accountant implements Employee{ |
步骤5: 创建一个 CompositePatternDemo 类,该类也将被视为 客户端 Client ,ii将使用Employee接口。
public class CompositePatternDemo { |
适用性
使用复合模式时
- 您想要表示对象的 部分— 整体 层次结构
- 您希望客户能够忽略对象组合和单个对象之间的差异。客户端将统一处理复合结构中的所有对象