我有一个Animation类。我需要在动画中有一些观察者为Play
,Pause
和Stop
事件。我发现了这个问题的两个解决方案,但我不知道该选什么。如何在C++中实现观察者模式
使用boost ::信号或类似的东西,并注册的回调,每一个事件
做一个简单的界面,与3个纯虚函数(
OnPlay()
,OnPause()
,OnStop()
),并传递给动画类对象实现这个接口。
每种方法都有其优点和缺点。我会尽力枚举我迄今发现的:
优势1.
- 我可以使用任何成员函数/ free函数作为回调
- 我没有实现所有3个功能,如果我不在乎所有的人
- 同一个对象可以作为观察员多个动画,而不从动画类传递参数获取
缺点为1
- 我要创建一个可调用对象逢回调
- 如果我想以后添加一个新的事件将很难找到它被使用的地方(编译不能强制我实施或忽略新事件)。
- 不知何故奇怪的语法(我必须在任何地方使用std :: bind/boost :: bind)。
优势2.
- 易于理解建设
- 如果我将在动画/ Observer接口类中添加一个新的事件,编译器将强制执行我实现(空也许)新的功能。
缺点为2
- 我要实现(空可能),即使我会用3个功能只有一个
- 同一个对象不能被用来作为观察员不同动画,而不需要从动画(ID或其他)发送一些额外的参数。
- 不能使用自由功能。
您能否告诉我要使用什么?根据你的经验,对于这个问题有什么更好的解决方案 - 从第一个问题中解脱出来,还是从第二个问题中清楚和容易理解的代码?你能否给我两种方法或其他解决方案的其他优点/缺点?
熟悉在C++ 11(我假设你可以使用,因为你用它标记的问题)lambda表达式除去大部分“弊端的1" 。 –
如果使用'std :: bind'对你来说是一种奇怪的语法(特别是与具有虚拟'OnWhatever'功能的接口相比),那么你应该重新考虑你选择的语言。 –
@ChristianRau不适合我,但我不是唯一一个在代码库上工作的人。 – Felics