《游戏编程模式》笔记——组件模式
意图
允许单一的实体跨越多个领域而不会导致这些领域彼此耦合。
模式
单一实体跨越了多个领域。为了保持领域之间相互分离,将每部分代码放入各自的组件类中。实体被简化为组件的容器。
何时使用
有一个涉及了多个领域的类,而你想保持这些领域相互隔离。
一个类正在变大而且越来越难以使用。
想要能定义一系列分享不同能力的类,但是使用继承无法让你精确选取重要的部分。
设计决策
对象如何获取组件?
如果对象创建组件:
可以保证对象总是能拿到需要的组件,但是重新设置对象会比较困难。组件模式的强力特性之一就是只需要重新组合组件就可以创建新的对象,如果对象总是硬编码组装自己,我们就无法利用这个特性。
如果外部代码提供组件:
对象更灵活。我们可以提供不同的组件,从而改变对象的行为。通过共用组件,对象变成了组件容器,我们可以为不同目的一遍又一遍的重用它。
对象可以与具体的组件类型解耦,对象只需要知道组件接口而不需要知道具体类型。
组件之间如何通信?
通过修改容器对象的状态:
这样做可以保持组件解耦。
但是需要将组件分享的任何数据存储在容器类中。通常状态只在几个组件间共享。
组件的通信也会基于组件的运行顺序,这需要我们小心的排列各种组件的操作保证运行时能达到想要的效果。
组件之间相互引用:
思路是组件持有要交流的组件的引用,不通过容器类直接进行交流。
虽然简单快捷,但是让组件之间绑在了一起。
通过发送消息:
最复杂的选项。在容器类中建立消息系统,允许组件相互发送消息。
好处是同级组件可以解耦,容器类也变的简单。
Unity的各种组件就是完全根据组件模式的原则进行的设计。
组件模式与策略模式类似。都是将对象的行为取出,划入单独的重述对象。区别是,策略模式通常是无状态的,仅封装了算法而没有数据。定义了对象如何行动,没有定义对象是什么。
组件更加重要。组件经常保存对象的状态,有助于确定其真实身份。有些组件也可能没有任何状态。在这种情况下,可以在不同的容器对象中使用相同的组件实例。这么看来,它的行为确实更像一种策略。
参考
《游戏编程模式》