游戏开发中常用的设计模式
使用设计模式来提高程序库的重复利用性是大型程序项目开发必须的。但是在“四人帮”的设计模式概述中提到了23种标准设计模式,不但难以记住,而且有些设计模式更多的适用于应用程序开发,对游戏项目引擎设计并没有很多的利用价值。根据经验,精挑细选后,笃志在这里记录一些自认为有利用价值的设计模式,以便之后自己设计时使用。
一:观察者Observer
观察者的设计意图和作用是: 它将对象与对象之间创建一种依赖关系,当其中一个对象发生变化时,它会将这个变化通知给与其创建关系的对象中,实现自动化的通知更新。
游戏中观察者的适用环境有:
1:UI控件管理类。当我们的GUI控件都使用观察者模式后,那么用户的任何界面相关操作和改变都将会通知其关联对象-----我们的UI事件机。
2:动画管理器。很多时候我们在播放一个动画桢的时候,对其Frame有很大兴趣,此时我们设置一个FrameLister对象对其进行监视,获得我们关心的事件进行处理是必须的。
观察者伪代码:
// 被观察对象目标类
Class Subject
{
// 对本目标绑定一个观察者 Attach( Observer );
// 解除一个观察者的绑定 DeleteAttach( Observer );
// 本目标发生改变了,通知所有的观察者,但没有传递改动了什么
Notity()
{
For ( …遍历整个ObserverList …)
{
pObserver ->Update(); }
}
// 对观察者暴露的接口,让观察者可获得本类有什么变动GetState();
}
//-------------------------------------------------------------------------------------------------------
// 观察者/监听者类
Class Observer
{
// 暴露给对象目标类的函数,当监听的对象发生了变动,则它会调用本函数通知观察者
Void Update ()
{
pSubject ->GetState(); // 获取监听对象发生了什么变化
TODO:DisposeFun(); // 根据状态不同,给予不同的处理
}
}
非程序语言描述:
A是B的好朋友,对B的行为非常关心。B要出门,此时A给了B一个警报器,告诉B说:“如果你有事,立刻按这个警报器告诉我。”。结果B在外面遇上了麻烦,按下警报器(Update()),B就知道A出了事,于是就调查一下B到底遇到了什么麻烦(GetState()),当知道B原来是因为被人打了,于是立刻进行处理DisposeFun(),派了一群手下帮B打架。
当然关心A的人可以不止一个,C,D可能也对A很关心,于是A这里保存一个所有关心它的人的链表,当遇到麻烦的时候,轮流给每个人一份通知。
二:单件模式Singleton
单件模式的设计意图和作用是: 保证一个类仅有一个实例,并且,仅提供一个访问它的全局访问点。
游戏中适用于单件模式的有:
1:所有的Manger。在大部分的流行引擎中都存在着它的影子,例如SoundManager, ParticeManager等。
2:大部分的工厂基类。这一点在大部分引擎中还是见不到的,实际上,我们的父类工厂采用唯一实例的话,我们子类进行扩展时也会有很大方便。
单件模式伪代码:
Class Singleton
{
Static MySingleton; // 单件对象,全局唯一的。
Static Instance(){
return MySingleton;} // 对外暴露接口
}
三:迭代器Iterator
迭代器设计意图和作用是: 提供一个方法,对一个组合聚合对象内各个元素进行访问,同时又不暴露该对象类的内部表示。
游戏中适用于迭代器模式的有: 因为STL的流行,这个设计已经广为人知了,我们对任何形式的资源通一管理时,不免会将其聚合起来,或者List,或者Vector,我们都需要一个对其进行访问的工具,迭代器无疑是一个利器。
迭代器伪代码:
// 迭代器基类
Class Iterator
{
Virtual First()