zoukankan      html  css  js  c++  java
  • 设计模式:学习笔记(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("发生了新的变化!");
    }
  • 相关阅读:
    IE hasLayout详解
    seajs引入jquery
    jquery实现轮播插件
    CSS视觉格式化模型
    js事件冒泡和事件捕获详解
    你尽力了么===BY cloudsky
    前向否定界定符 python正则表达式不匹配某个字符串 以及无捕获组和命名组(转)
    php safe mode bypass all <转>
    WAF指纹探测及识别技术<freebuf>
    linux集群管理<转>
  • 原文地址:https://www.cnblogs.com/MrSaver/p/6558636.html
Copyright © 2011-2022 走看看