组合式开发,也少量使用继承,比如组件,实体都是有基类的。
这里讨论这两种方式时,继承式指的是主要通过继承不同的父类和更多子类来实现事物的多样化,而组合式主要通过添加多种组件来实现事物的多样化。
代码组织上的差异
Unity就是典型的组件式开发,比如Transform组件,如果采用继承式,就会把Transform的方法属性都写到GameObject这个基类中,如果用组合式,就把Transform的方法属性折分出来定义一个Transform的组件。
所以不论什么模式,无非是如何组织一个事物的所有属性和方法。
是都放在一个类中,还是分别放在父子类中,或者是某类方法属性放在一个不相干的类中(比如Transtorm组件)。
继承式通过定义更多的子类和向上继承来增加更多属性和方法,而组件式通过定义更多组件来增加更多属性和方法。
继承链中的方法属性是可以直接调用的,而不同组件上的方法和属性需要跨组件调用。
内存管理上的差异
继承式,不论继承链有多少层,最终一个事物在内存中就创建一个实例。
组合式,每个组件都创建一个实例,最终一个事物是由内存中的多个实例组合而成的,所以跨组件不能直接调用方法和属性,要先获取到目标组件的实例。
那内存中一堆组件的实例,如何知道哪个组件是哪个事物的?在unity中就是由GameObject作为纽带决定的,他记录了已添加哪些组件组合成一个独立的事物。这种GameObject类型,就是一种实体。
Fantasy框架中,也定义了一种实体就是Entity类型。
Fantasy没有专门的Component类型,开发者可以自己定义各种组件类型,比如AOIComponent。自定义的组件只需要继承Entity即可作为组件添加给任何实体,并且只能添加给Entity类型或其子类型的实体对象作为其组件。
这就形成了组合式(面向组件)开发与继承式(面向对象)开发的重要差异:
组合式,一个事物务是由多个实例组合而成的,所以可以需要时添加更多组件实例,也可以不需要时移除这些组件,从内存中释放这些组件的实例。
功能实现上的差异
组合式开发,除了灵活的内存释放外,这种按需要添加组件,还可以通过配置文件来设定。
这样同一个套程序代码,可以根据不同配置需求,运行时添加不同的组件,从而实现不同的服务器功能。哪怕成千上万组服务器,上百种不同功能的服务,只需要修改配置文件,全都部署同一套代码即可。