我有一个Animation类。我需要为Animation中的Play、Pause和Stop事件添加一些观察者。我找到了两种解决方案,但我不知道该选择哪个。
1. 使用boost::signals或类似的东西,并为每个事件注册回调函数。 2. 创建一个简单的接口,具有3个纯虚函数(OnPlay()、OnPause()、OnStop()),并将实现此接口的对象传递给Animation类。
每种方法都有优缺点。我尝试列举我目前发现的一些:
1. 的优点: - 可以使用任何成员函数/自由函数作为回调 - 如果不关心所有函数,则不必实现所有3个函数 - 同一对象可以作为多个动画的观察者而无需从Animation类传递额外参数
1. 的缺点: - 必须为每个回调创建可调用对象 - 如果以后要添加新事件,则很难找到使用它的地方(编译器不能强制我实现或忽略新事件)。 - 语法有些奇怪(必须在各处使用std::bind/boost::bind)。
2. 的优点: - 构造易于理解 - 如果我在Animation/Observer接口类中添加新事件,编译器将强制我实现(可能为空)新函数。
2. 的缺点: - 即使只使用其中一个,也必须实现(可能为空)3个函数 - 同一对象不能作为不同动画的观察者,而无需从动画传递某些额外参数(ID或其他内容)。 - 无法使用自由函数。
请问您应该选择哪一个?根据您的经验,对于这个问题,是第一种方法的自由还是第二种方法的清晰易懂的代码更好?您能否为两种方法提供其他优缺点或其他解决方案?
1. 使用boost::signals或类似的东西,并为每个事件注册回调函数。 2. 创建一个简单的接口,具有3个纯虚函数(OnPlay()、OnPause()、OnStop()),并将实现此接口的对象传递给Animation类。
每种方法都有优缺点。我尝试列举我目前发现的一些:
1. 的优点: - 可以使用任何成员函数/自由函数作为回调 - 如果不关心所有函数,则不必实现所有3个函数 - 同一对象可以作为多个动画的观察者而无需从Animation类传递额外参数
1. 的缺点: - 必须为每个回调创建可调用对象 - 如果以后要添加新事件,则很难找到使用它的地方(编译器不能强制我实现或忽略新事件)。 - 语法有些奇怪(必须在各处使用std::bind/boost::bind)。
2. 的优点: - 构造易于理解 - 如果我在Animation/Observer接口类中添加新事件,编译器将强制我实现(可能为空)新函数。
2. 的缺点: - 即使只使用其中一个,也必须实现(可能为空)3个函数 - 同一对象不能作为不同动画的观察者,而无需从动画传递某些额外参数(ID或其他内容)。 - 无法使用自由函数。
请问您应该选择哪一个?根据您的经验,对于这个问题,是第一种方法的自由还是第二种方法的清晰易懂的代码更好?您能否为两种方法提供其他优缺点或其他解决方案?
std::bind
对你来说是奇怪的语法(特别是与具有虚拟OnWhatever
函数的接口相比),那么你应该重新考虑你选择的编程语言。 - Christian Rau