设计模式:学习笔记(2)——观察者模式

设计模式:学习笔记(2)——观察者模式

观察者模式

   观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象状态改变时,他的所有依赖者都会收到通知并自动更新
   就好像下面这样:当主题对象中的一些状态发生改变时,就会通知他的观察者,狗、猫、鸭子等,但是牛并不是观察者,所以不会收到通知。
  

从这幅图我们发现:

☐ 所有的观察者都需要遵守一定的准则,才能区别于非观察者对象。观察者会收到通知并更新,说明他们有一个共同的方法,可以是update(),故我们可以让他们继承同一个接口。

☐ 主题对象一定是有一个观察者列表,并且这个列表可以动态更新,他在通知时可以根据列表来推送消息。

观察者模式的类图

  

说明:

  Subject是主题接口,使用此接口中的RegisterObserver来注册接口,等等。 所有潜在的观察者必须实现观察者接口,这个接口只有Update()一个方法,当主题状态改变时它被调用。

观察者模式实现

构建观察者与主题对象

构建观察者

所有的观察者实现Observer

public class CatObserver implements Observer{
    //所有观察者实现观察者接口
    public void update(Object args){}
}

我们一共实现了三个观察者

  

构建主题对象

被观察者即主题对象需要继承Observable类

public abstract class Observable{
    List<Object> observers= new ArrayList<>();
    public void notifyObservers(String info)
    {
        obserbers.forEach(animal -> animal.update(info))
    }
    public void addObserver(Object o)
    {
        observers.add(o);
    }
    .....
}

public class SubjectObserable  extends Observable {
    ....
}
说明:一个 observable 对象可以有一个或多个观察者。观察者可以是实现了 Observer 接口的任意对象。一个 observable 实例改变后,调用 Observable 的 notifyObservers 方法的应用程序会通过调用观察者的 update 方法来通知观察者该实例发生了改变。

实现通知

public static void main(String[] args) {
    SubjectObserable subject = new SubjectObserable();
    subject.addObserver(new MouseObserver());
    subject.addObserver(new CatObserver());
    subject.addObserver(new DogObserver());
    subject.notifyObservers("发生了新的变化!");
}
原文地址:https://www.cnblogs.com/MrSaver/p/6558636.html