设计模式目前分为23种三大类,而观察者模式作为开发设计中常用的代码设计模式之一,属于行为模式中的一种,也是我们众多开发最容易掌握应用的一种,今天我们来聊一聊观察者模式。
观察者模式的定义
观察者模式(Observer Design Pattern):在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会得到通知并自动更新。简单点来说就是当某个对象发生改变时,这个对象的所有观察者都会做出相应的改变。
举个例子,当你干项目时,一旦你的进度发生改变,盯着这项目的领导们,会根据项目的进度做出不同的计划策略。当进度慢时,产品催着你加班赶进度,市场做好规划预宣传,人事继续招人……
Subject(被观察者)
定义被观察者必须实现的职责, 它可以动态地增加、 删除观察者。它的两大主要作用是:管理观察者并通知观察者。
Observer(观察者)
观察者接收到变更消息后,就会进行对应的方法操作,对接收到的信息进行处理。
ConcreteSubject(被观察者的实现类)
定义被观察者自己的业务逻辑, 同时定义对哪些事件进行通知。
ConcreteObserver(观察者具体实现)
每个观察者在接收到消息后的处理反应是不同,各个观察者有自己的处理逻辑。
Code Time
接下来我们用代码简单实现一下图一的中观察者模式,首先我们创建一个被观察者父类Subject,里面包括观察者的添加移除以及触发变化事件;
然后创建一个观察者的的父类接口Observer,里面包含被观察者发生变化时,观察者需做出对应变化的事件;
接下来,定义一个Me继承自Subject的被察者类,里面有做项目doProject和一个判断方法,当出现delay时,就通知项目的其他人项目延期了,要做出对应的措施了;
这里我就简单举例写HRPMOM三个类型的观察者了,如果需要其他观察者类型,再实现Observer接口即可。
最后,我们来测试一下代码,先创建一个张三的被观察者类,然后分别创建HR、PM、OM的观察者,加入观察张三的队列,最后在被观察者张三执行逻辑时,触发监听改变的事件,所有加入观察张三的观察者触发自己相应的逻辑。
运行上述代码的结果是:
干活的张三因为项目延期了,其他观察张三的观察者果然都做出了自己的处理,HR招人,PM催加班,市场重新规划……
观察者模式的优缺点
优点
缺点
应用场景
总结
观察者模式是一种比较容易理解的代码设计模式之一,在很多框架中都运用到它,比如Spring、Tomcat、MQ设计中都有大量使用。虽然理解简单,但用得好却也不容易,比如需要考虑使用异步通知提高性能时通知可靠性等因素。