Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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 更好的模式观察者?_Java_Design Patterns_Inheritance_Listener - Fatal编程技术网

Java 更好的模式观察者?

Java 更好的模式观察者?,java,design-patterns,inheritance,listener,Java,Design Patterns,Inheritance,Listener,我使用模式观察者,但发现从具有侦听器的类继承变得越来越困难。如果继承类中还存在侦听器,则很难控制哪些侦听器工作。 是否存在类似于观察者但对听者有更好控制的模式? 谢谢。似乎您不想使用继承来实现观察者模式 如果我没有弄错上面这一点,那么您可以使用接口来实现它。只需为Subject和Observer声明两个接口,然后让您的类实现它们 例如,你的拍摄对象可能看起来像这样- public interface Subject { public void registerObserver(Obser

我使用模式观察者,但发现从具有侦听器的类继承变得越来越困难。如果继承类中还存在侦听器,则很难控制哪些侦听器工作。 是否存在类似于观察者但对听者有更好控制的模式?
谢谢。

似乎您不想使用继承来实现观察者模式

如果我没有弄错上面这一点,那么您可以使用接口来实现它。只需为Subject和Observer声明两个接口,然后让您的类实现它们

例如,你的拍摄对象可能看起来像这样-

public interface Subject {
    public void registerObserver(Observer o);
    public void removeObserver(Observer o);
    public void notifyObservers();
}
观察员-

public interface Observer {
    public void update(int age, float salary);    // imaginary parameters.....
}
然后,您的具体主题可以从上述
Subject
接口继承-

public class SubjectImpl implements Subject{
    private ArrayList observers;

    public void registerObserver(Observer o){
        observers.add(o);
    }
    public void removeObserver(Observer o){
        int i = observers.indexOf(o);
        if (i >= 0) {
            observers.remove(i);
        }
    }
    public void notifyObservers(){
        for (int i = 0; i < observers.size(); i++) {
            Observer observer = (Observer)observers.get(i);
            observer.update(30, 200.50);    // imaginary arguments, provide your own...
        }
    }
}
然后你可以使用-

Subject s = new SubjectImpl();
Observer o = new ObserverImpl(s);

// do whatever you want now
这种方法当然比类继承要好,因为在这种情况下,您的主题和观察者都可以从其他类继承,从而提供更灵活的设计

如果您的问题是关于在不继承的情况下提供java侦听器实现,那么您可以使用-

ActionListener listener = new ActionListener() {
    public void actionPerformed(ActionEvent ae) {
        System.out.println("Anonymous class example");
    }
};

yourButton.addActionListener(listener);
是对观测器设计模式的改进

如前所述,它在Qt(C++)中被广泛使用


这是中的相关问题和实现。

对不起,我不理解您的问题。您能提供一些示例代码来演示您的观察者模式实现吗?这是观察者模式,而不是相反。撇开这一点不谈,“很难控制哪些侦听器工作”是什么意思?这是Java中已知的“问题”:观察者模式是用
Observable
抽象类实现的,这导致您无法扩展任何其他类。这是一个很好的Java面试问题。界面的选择是正确的。@Brady:是的,你说得对。但是OP说他/她正在实现该模式,所以我假设这里使用类继承,所以我认为接口继承可能是更好的选择。
ActionListener listener = new ActionListener() {
    public void actionPerformed(ActionEvent ae) {
        System.out.println("Anonymous class example");
    }
};

yourButton.addActionListener(listener);