目录
一、意图
创造类A来允许灵活地创新“类型”,类A的每个实例都代表了不同的对象类型。
二、动机
以怪物为例,在一个游戏中可能有很多中怪物。他们有相同的行为,走,攻击,跳跃等。但是他们的血量,攻击力,速度有不同。
传统的面向对象方案是,写一个Monster基类,然后每种怪物都继承基类。
但这样的缺点是:数值硬编码,想要修改数据都需要改代码。每种怪物都要重复这些代码。
优化:让每个品种不再继承Monster,每个怪物是Monster的实例。然后将公共的信息写在Breed类中,Monster去引用Breed类。
三、类型对象
定义类型对象类(Monster)和有类型的对象类(Breed类)。每个类型对象实例代表一种不同的逻辑类型。每种有类型的对象保存对描述它类型的类型对象的引用。
1. 适用场景:
1.类型不定,容易被拓展
2.想不改变代码或者重新编译就能修改或添加新的类型
注意:这里我们就需要自己将每个品种对象的实例化到内存中,保证正确的引用。
2.难以定义每种类型的行为
在类型对象模式中,想实现一个夜晚攻击力增加的效果是在改变了攻击力的数值。使用替换成员变量的方法替换了传统的重载方法。
解决:
第一种方法:使用预先定义的固定行为,每个类型对象中的数据简单地选择他们中的一个。也就是定义函数来实现每种行为,在方法中存储合适函数的引用。
第二种方法:真正的在数据中定义行为,使用字节码模式。
四、实例代码
单继承实现部分数据的共享:
暴露类型对象:
显示暴露娄星对象的好处:
1.外部代码可以与类型对象直接交互,无需拥有类型对象的实例
2.类型对象现在是对象公共API的一部分了
继承关系
可以没有继承,简单,但是会有大量重复工作。
单继承,也简单,查询属性更慢。
多重继承,避免代码重复,复杂。