在java中避免instanceof操作符的同时观察多个观察值?
如果我有一个物体,我希望能够观察到其他几个可观察的物体,而不是所有类型的。例如,我希望A能够观察到B和C。B和C是完全不相关的,除了它们都实现了Observable在java中避免instanceof操作符的同时观察多个观察值?,java,observer-pattern,Java,Observer Pattern,如果我有一个物体,我希望能够观察到其他几个可观察的物体,而不是所有类型的。例如,我希望A能够观察到B和C。B和C是完全不相关的,除了它们都实现了Observable 显而易见的解决方案是在update方法中使用“if instanceof”,但这很快就会变得混乱,因此我想知道是否还有其他方法?假设对象B/C上的操作是相同的,并且您只想出于状态转换的目的区分这两个对象,您还可以创建一个实现实际观察逻辑/状态的委托对象,并在主对象中使用查找机制来检索特定可观察对象的正确委托。然后转接电话 您可以始终
显而易见的解决方案是在update方法中使用“if instanceof”,但这很快就会变得混乱,因此我想知道是否还有其他方法?假设对象B/C上的操作是相同的,并且您只想出于状态转换的目的区分这两个对象,您还可以创建一个实现实际观察逻辑/状态的委托对象,并在主对象中使用查找机制来检索特定可观察对象的正确委托。然后转接电话 您可以始终拥有一个
映射,类似于您可以将更新更改为的先前建议
public void update(Observable o, Object arg) {
try{
Method update = getClass().getMethod(o.getClass(), Object.class);
update.invoke(this, o, arg);
} catch(Exception e) {
// log exception
}
}
这样,您可以添加一个方法
public void update(A a, Object arg);
public void update(B b, Object arg);
public void update(C c, Object arg);
对于要观察的每种类型。不幸的是,您需要知道可观察对象的确切具体类型。但是,您可以更改反射以允许接口等。一个干净的解决方案是使用A
中的(匿名)内部类充当观察者。例如:
class A {
public A(B b, C c) {
b.addObserver(new BObserver());
c.addObserver(new CObserver());
}
private class BObserver implements Observer {
// Logic for updates on B in update method
}
private class CObserver implements Observer {
// Logic for updates on C in update method
}
}
这将允许您将BObserver
/CObserver
实例添加到实际要观看的B
s和C
s中。它还有一个额外的好处,那就是A
的公共接口不那么杂乱,您可以轻松地添加新的内部类来处理D
、E
和F
类。几乎可以肯定,您希望使内部类匿名。一般来说,是的,但对于本例,命名类会使其更具可读性。