我正在开发一个集中使用观察者模式的项目.
许多类用作事件/消息侦听器.
通常,监听类在构造函数中注册自己,我看到了两个问题:
>我们正在构造函数中工作
>该类依赖于观察到的类,即使它只对事件本身感兴趣.
注册是否应由听力课负责,还是应该在其他地方?
最佳答案
从构造函数中订阅可能会导致继承问题.假设我们的代码看起来像这样:
原文链接:https://www.f2er.com/java/437291.htmlpublic class Parent {
public Parent(EventObject source) {
// initialize parent ...
source.subscribe(this::someMethod);
}
public void someMethod() {
...
}
...
}
public class Child extends Parent {
public Child(EventObject source) {
super(source);
// initialize child ...
}
...
}
Child ctor调用Parent ctor,它将自己注册到事件源.但请注意,在注册Parent时,未对Child对象进行初始化.如果事件源在Child ctor完成之前更新,则您的代码可能表现得非常奇怪.
避免此问题的一种简单方法是在工厂方法中进行订阅,从而隐藏ctors.
public class Parent {
public static Parent newInstance(EventObject source) {
Parent p = new Parent();
source.subscribe(p::someMethod);
return p;
}
protected Parent() {
// initialize parent ...
}
public void someMethod() {
...
}
...
}
public class Child extends Parent {
public static Child newInstance(EventObject source) {
Child c = new Child();
source.subscribe(c::someMethod);
return c;
}
protected Child() {
super();
// initialize child ...
}
...
}