使用观察者模式

时间:2017-09-17 19:23:14

标签: java observer-pattern

我下面有一个观察员班。我的问题是我如何设置这个课来听(观察)超过1个科目?

    public class Observer2 implements Observer {
      private Subject robot;


      public Observer2(Subject robot){
       this.robot = robot;
       robot.registerObserver(this);
    }

      @Override
      public void update(){}
}

4 个答案:

答案 0 :(得分:1)

您可以拥有一个Subject类,它将所有观察者存储在列表中。

public abstract class Subject
{
    private ArrayList<Observer> observerList = new ArrayList<>();

    public void attach(Observer observer)
    {
        observerList.add(observer);
    }

    /**
     * Notifies observers to run execute
     */
    protected void notifyObservers()
    {
        for(int i = 0; i < observerList.size(); i++)
        {
            observerList.get(i).update();
        }
    }
}

典型的Observer接口:

interface Observer
{
    void update();
}

此后,您可以使用notifyObservers()方法触发观察者。

答案 1 :(得分:0)

使用一套。

public class MultiObserver extends Observer {
    private final Set<Subject> observed = new HashSet<>();

    public void observe(Subject s) {
        if (observed.add(s))
            s.registerObserver(this);
    }
}

答案 2 :(得分:0)

使用Java ObserverObservable,它们是为正确处理多个主题而设置的:

class Robot extends Observable {
    public void act() {
        notifyObservers("Run!");
    }
}
class Cyborg extends Observable {
    public void act() {
        notifyObservers("Hide!");
    }
}

public class MyObserver implements Observer {
    @Override
    public void update(Observable subj, Object arg) {
        if (subj instanceof Robot) {
            System.out.println("Scary robot says " + arg);
        } else if (subj instanceof Cyborg) {
            System.out.println("Lovely cyborg says " + arg);
        } else {
            System.out.println("What's this? " + arg);
        }
    }
}

注册方式不同:

// Construct observables
Robot r = new Robot();
Cyborg c = new Cyborg();
// Add observer to both of them
MyObserver o = new MyObserver();
r.addObserver(o);
c.addObserver(o);
r.act();
c.act();

答案 3 :(得分:0)

ConcreteObserver可以观察多个主题,只需多次调用主题提供的附加方法。
如果问题是:

“ConcreteObserver如何观察具有不同类型状态的许多不同类型的ConcreteSubject?”

答案是,在 ConcreteObserver 中,必须重载更新方法,以便管理多次等于ConcreteObserver必须遵守的状态类型。
ConcreteObserver必须还有一个状态数组来存储被摄体的观察状态,并有一些机制可以避免来自不同主体的相同类型的状态影响彼此的状态。