观察者模式小记

Posted xzshare

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了观察者模式小记相关的知识,希望对你有一定的参考价值。

观察者模式,我们有很多其他的方式来称呼它。比如熟悉的发布/订阅模式,回调方式,Listen监听等。

我们看到很多源码中有Observer,Listen,Hook,Callback,基本用到了观察者模式;

话不多说,直接来点代码说明下

首先定义被观察者(抽象的,公有的)

public interface Subject {

    /**
     * 添加观察者
     *
     * @param observer
     */
    void add(Observer observer);

    /**
     * 删除观察者
     *
     * @param observer
     */
    void del(Observer observer);

    /**
     * 通知所有观察者
     */
    void notifyObservers(String content);

}

再定一个被观察者自身操作的接口

public interface IUser {

    /**
     * 自身操作
     */
    void operation();
}

再定义一个公用的被观察者实现类(这里可有可无,也可放到下面具体的观察者中)

public abstract class AbstractSubject implements Subject {

    private Vector<Observer> observers;

    public AbstractSubject() {
        observers = new Vector<>();
    }

    @Override
    public void add(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void del(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void notifyObservers(String content) {
        Enumeration<Observer> obs = this.observers.elements();
        while (obs.hasMoreElements()) {
            obs.nextElement().update(content);
        }
    }

}

接下来就是定义具体的被观察者

public class MySubject extends AbstractSubject implements IUser {
    @Override
    public void operation() {
        System.out.println("update myself observer");
        notifyObservers("just update");
    }
}

 

被观察者有了,接下来就是观察者了

首先定义下观察者接口

public interface Observer {
    void update(String content);
}

然后定义具体的观察者

public class Observer1 implements Observer {
    @Override
    public void update(String content) {
        System.out.println("update observer1,show content:"+content);
    }
}

最后就是具体的实现了

public class ObserverTest {
    public static void main(String[] args) {
        MySubject subject = new MySubject();
        subject.add(new Observer1());
        subject.add(new Observer2());
        subject.operation();
    }
}

我们添加观察者,然后被观察者一有行动,观察者就能收到信息,并作出反应。

上述运行结果如下:

技术图片

 

 以上就是简单的阐释下观察者模式,实际中我们用到的场景比这复杂很多。

观察者模式在实际项目和生活中非常常见,我们举几个经常发生的例子来说明。
● 文件系统
比如,在一个目录下新建立一个文件,这个动作会同时通知目录管理器增加该目录,并 通知磁盘管理器减少1KB的空间,也就说“文件”是一个被观察者,“目录管理器”和“磁盘管理 器”则是观察者。
● 猫鼠游戏
夜里猫叫一声,家里的老鼠撒腿就跑,同时也吵醒了熟睡的主人,这个场景中,“猫”就
是被观察者,老鼠和人则是观察者。
● ATM取钱
比如你到ATM机器上取钱,多次输错密码,卡就会被ATM吞掉,吞卡动作发生的时
候,会触发哪些事件呢?第一,摄像头连续快拍,第二,通知监控系统,吞卡发生;第三, 初始化ATM机屏幕,返回最初状态。一般前两个动作都是通过观察者模式来完成的,后一个
动作是异常来完成。
● 广播收音机
电台在广播,你可以打开一个收音机,或者两个收音机来收听,电台就是被观察者,收
音机就是观察者。

 

以上是关于观察者模式小记的主要内容,如果未能解决你的问题,请参考以下文章

学习 vue2.0/3.0 中的proxy和Object.defineProperty 小记

设计模式 行为型模式 -- 观察者模式(发布-订阅(Publish/Subscribe)模式)

设计模式之单例模式

未调用 LiveData 观察者

Java设计模式补充:回调模式事件监听器模式观察者模式(转)

如何为片段设置观察者