设计模式之观察者模式
Posted 路过你的全世界
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之观察者模式相关的知识,希望对你有一定的参考价值。
什么是观察者模式?
定义对象间的一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖他的对象都会得到通知并被自动更新。
观察者模式用在哪?
观察者模式的典型应用就是在类似的“订阅—发布”系统。我们都用过邮箱,这里以QQ邮箱为例,我们可以在邮箱中进行订阅某个订阅号,之后每次我们就可以收到该订阅号发送过来的资讯信息。在这里我们就相当于观察者,订阅号就是被观察者,被观察者更新了数据,我们观察者就可以看到具体的变化。
观察者模式实现
我们就以上述的“订阅–发布”为例子,具体的展示下观察者模式
我们先来看下观察者代码
//Observer 是JDK内置接口,我们可以直接使用 public class Coder implements Observer private String sName; public Coder(String name) sName = name; @Override public void update(Observable observable, Object data) System.out.println("我的名字是:" + sName + ",内容已经更新:" + data);
观察者实现Observer接口,并实现update方法。
接下来实现被观察者代码
//Observable 属于JDK内置类 public class DevTechFrontier extends Observable //定义一个方法,提供内容内容更新入口 public void postNewPublication(String content) //标识状态或者内容发生改变 setChanged(); //通知所有观察者 notifyObservers(content);
被观察者继承Observable类,之后我们定义一个方法,提供内容更新入口
调用过程
public class MainTest public static void main(String[] args) //实例化被观察者对象 DevTechFrontier devTechFrontier =new DevTechFrontier(); //创建观察者 Coder coder1 =new Coder("coder1"); Coder coder2 =new Coder("coder2"); Coder coder3 =new Coder("coder3"); Coder coder4 =new Coder("coder4"); //将观察者注册到可观察对象的观察者列表中 devTechFrontier.addObserver(coder1); devTechFrontier.addObserver(coder2); devTechFrontier.addObserver(coder3); devTechFrontier.addObserver(coder4); //更新消息 devTechFrontier.postNewPublication("我们发布了新内容");
显示结果(注意打印顺序和注册顺序相反)
我的名字是:coder4,内容已经更新:我们发布了新内容
我的名字是:coder3,内容已经更新:我们发布了新内容
我的名字是:coder2,内容已经更新:我们发布了新内容
我的名字是:coder1,内容已经更新:我们发布了新内容
观察者模式分析
观察者模式一个重要的功能就是解耦,将观察者和被观察者解耦,使得他们的依赖降低,甚至毫无依赖,增强了系统灵活性,可拓展性。
在应用观察者模式的时候,要考虑下开发效率和运行效率问题,程序包括一个被观察者和若干个观察者,开发调试的工作量较大。
源码补充
以上是关于设计模式之观察者模式的主要内容,如果未能解决你的问题,请参考以下文章
深入理解JavaScript系列(32):设计模式之观察者模式