在观察者模式中,Observer通常通过调用每个方法来通知侦听器,如:
OnSomethingUpdated(Object) {
....
在这种情况下,我们有耦合:Observer应该对每个侦听器执行一些操作。 当我想通过继承修改Observer或Listener或尝试提取抽象超类来简化Observer(或Listener)的逻辑时,它会传播难以传播的消息,我会收到意大利面条代码。 我认为应该存在某种方式将Observer工作的业务逻辑与传播消息的逻辑分离到监听器。可能更好的相反 - 听众应检查一些消息池。 是否存在类似的模式? 感谢。
答案 0 :(得分:3)
侦听器实际上应该是一个接口:
interface MyListener {
void onSomethingUpdated(Object eventData);
}
这样,主体与其观察者的具体实例脱钩;它应该保留这些接口引用的列表。
看看如何用Java实现这种模式{。{3}}。
现在,为了进一步将主题与消息传播分离,我建议你看一下here模式。
答案 1 :(得分:1)
在observer pattern中,Observer
注册且主题为Observable
。 onSomethingUpdated()
的{{1}}方法由Observer
调用,它通知所有松散耦合的侦听器。有一个相关的例子here。
答案 2 :(得分:1)
您可能不会非常喜欢这个答案,但无论如何我都会说:继承不是代码重用。观察者模式不应该导致紧张耦合 - 它应该导致解耦!因此,如果您在提取抽象基类或子类时提取观察者/听众周围的意大利面条代码,那么因为不应该使用继承。< /强>
在那里,我说了。
答案 3 :(得分:0)
您可以在中间添加Business Delegate或简单的Facade。
因此,Observer只接收通知,然后将实现委托给包含业务逻辑的实际对象。这样您就可以随意对Business Logic类进行更改。