我正在构建一个开源库,我可以总结如下:
class SuperThing {
public function doStuff($object) {
// ...
}
}
我想为库的用户提供添加自定义行为的可能性。
例如,他可能想在操作中的特定点插入一些日志记录,或者他可能想在某个点修改对象。
我看到了两种方法:
模板方法模式似乎很合适,但它会迫使我添加很多受保护的方法(比如
beforeDoingThingA()
,afterDoingThingA()
...),它会迫使库的用户扩展我的类以添加他的行为。使用事件:
SuperThing::doStuff()
引发事件,用户可以注册到任何他想要的。
对我来说,使用事件似乎更简单、更清晰、更易于维护......
但在我看来,事件主要是关于发送发生某事的消息。不允许有人“钩”入操作并修改某些对象。也许我错了。
那么事件是否适合这种情况?如果没有,是否有模板方法模式的替代方案?