在实践中,发现面向组件,状态机,消息驱动。如果整合起来的模型,能够更为自然和简单的进行抽象。当然这些都是以面向对象为基础,更进一步的抽象扩展。本文,先会分别介绍一下,面向组件,状态机,消息驱动的各自特点。然后,介绍如何整合三者。最后,给出代码示例。
第一,面向组件
在游戏开发中有些引擎会使用基于组件的架构。比如unity3d就是其中的典型。基于组件,有以下特性。
- 基类Componet负责组件的生命周期和状态管理。
- Entity对象,也就是unity里面的GameObject,负责管理Component组件。Entity对象拥有任意多个组件,这里是组合模式。
- 所有的功能可以组件化,就是具体的功能继承Componet来实现,作为一个组件,可以复用到Entity对象上。
- Entity做为一个功能的集合抽象,与其他Entity可以发生交互,或者消息交换。Entity的功能大多来自于可复用的Componet,功能绑定的力度需要具体由设计者决定。
- Entity可以再运行时,动态的增加或者减少Componet,或者修改Componet的状态。
面向组件架构,倾向使用组合模式,通过组件来复用功能。其实,就是把通过继承得到的功能复用,拆散到组件里,然后组合起来使用。面向对象有以下几个问题。
- 为了一个功能去继承,就获得了父类所有其它无用,甚至不想关的功能,造成冗余。
- 当继承链超过3层的时候,对象职能无法保持单一,不便于记忆和使用。
- 继承可以操作父类的某些属性,在继承链中各自对象的操作,可能带来潜在的冲突。
- 面向对象一般是通过一个角度切入进行抽象,如果需要进行多层面的角度去抽象,面向对象很难划分对象结构去进行描述。
面向对象中的对象,是一种视角的抽象描述。我们如何去划分这个对象,至关重要,以及人为的去限制对象的边界。但现实世界,是多个角度,横看成岭侧成峰的,当用一个视角抽象对象的时候,换一个视角原来的抽象就会不兼容或是面目前非。
面向组件,这里的组