RobertNystrom的游戏编程模式-第16章

本文探讨了服务定位器模式在游戏开发中的应用,通过实例解释如何解耦服务提供与使用,实现服务的灵活管理和扩展。介绍了如何使用该模式管理音频服务,包括服务的关闭、扩展及替换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

此为RobertNystrom著作游戏编程模式的读书笔记。

第16章-服务定位器

在cocos中的音频播放一般使用SimpleAudioEngine::getInstance()->playBackgroundMusic()这个即为文中提及的使用单例访问服务。

而这里文章指出使用服务定位器解耦了一个服务是什么和一个服务在哪里。

首先一个抽象的Audio类规定暴露服务的结构是啥,以便外界调用。几个子类(concreteAudio)实现Audio,一个Locator依赖Audio型对象的指针。使用的时候实际上是通过Locator::getAudio()来获取到Audio型对象(实际上是其实现子类concreteAudio)。在使用Locator::getAudio()之前注意要对Locator注入依赖,即:

concreteAudio* audio=new concreteAudio();

Locator::privide(audio); //依赖注入


其他模块中使用代码

Audio* audio=Locator::getAudio();

audio->playSound(_SOMETHING_);


不过要有一个防止未注入依赖而产生空服务的机制,为此我们定义一个Audio的子类叫NullAudio,用于实现Audio中接口但是什么都不做,如果未注入依赖就默认返回这个NullAudio类型的引用。(为什么是引用而不是指针,因为C++中引用不会为NULL)


此模式的优点一:其作用在于方便关闭服务,比如关闭音效。

优点二:是可以实现对服务的扩展,比如日志装饰器,不同领域的程序员如AI程序员或音效程序员都需要log来调试,直接使用log会照成日志太多。我们可以将不同系统的条件日志作为服务暴露出去,利用装饰器模式实现它。我们可以定义LoggedAudio类,继承自Audio,并保留一个Audio*做为被装饰者wrapped,用wrapped实现Audio的各接口,但是又在各接口中把log这件事干了。随后我们把LoggedAudio为依赖注入给Locator。现在任何的音频服务在调用时均被log出来了。

优点三:可以替换服务,比如某服务可以由网络来完成,而使用Locator的代码不必知道。还可以在编译时绑定,即根据宏定义定义Locator中的不同Audio*,不过最牛逼的还是根据配置文件取出字符串,然后利用反射绑定想要的Audio*服务。unity中GetComponent()方法中就利用了这个模式。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值