Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中避免instanceof操作符的同时观察多个观察值?_Java_Observer Pattern - Fatal编程技术网

在java中避免instanceof操作符的同时观察多个观察值?

在java中避免instanceof操作符的同时观察多个观察值?,java,observer-pattern,Java,Observer Pattern,如果我有一个物体,我希望能够观察到其他几个可观察的物体,而不是所有类型的。例如,我希望A能够观察到B和C。B和C是完全不相关的,除了它们都实现了Observable 显而易见的解决方案是在update方法中使用“if instanceof”,但这很快就会变得混乱,因此我想知道是否还有其他方法?假设对象B/C上的操作是相同的,并且您只想出于状态转换的目的区分这两个对象,您还可以创建一个实现实际观察逻辑/状态的委托对象,并在主对象中使用查找机制来检索特定可观察对象的正确委托。然后转接电话 您可以始终

如果我有一个物体,我希望能够观察到其他几个可观察的物体,而不是所有类型的。例如,我希望A能够观察到B和C。B和C是完全不相关的,除了它们都实现了Observable


显而易见的解决方案是在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

类。几乎可以肯定,您希望使内部类匿名。一般来说,是的,但对于本例,命名类会使其更具可读性。