观察者模式小记
观察者模式,我们有很多其他的方式来称呼它。比如熟悉的发布/订阅模式,回调方式,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机屏幕,返回最初状态。一般前两个动作都是通过观察者模式来完成的,后一个
动作是异常来完成。
● 广播收音机
电台在广播,你可以打开一个收音机,或者两个收音机来收听,电台就是被观察者,收
音机就是观察者。
互相学习,欢迎转载,转载请注明出处,谢谢!