定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。
建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应。在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,可以根据需要增加和删除观察者,使得系统更易于扩展,这就是观察者模式的模式动机。
Subject: 主题 ConcreteSubject: 具体主题 Observer: 观察者 ConcreteObserver: 具体观察者
主题:服务号 观察者:普通使用者
1.创建主题
package observe; /** * TODO * * @author tudou * @version 1.0 * @date 2019/5/26 17:39 **/ public interface Subject { /** * 注册一个观察者 * @param observer */ public void registerObserver(Observer observer); /** * 移除一个观察者 * @param observer */ public void removeObserver(Observer observer); /** * 通知所有的观察者 */ public void notifyObservers(); }2.创建观察者
package observe; /** * TODO * * @author tudou * @version 1.0 * @date 2019/5/26 17:40 **/ public interface Observer { /** * 所有的观察者都需要实现此接口 */ public void update(String msg); } 具体主题即微信服务的内容 package observe; import java.util.ArrayList; import java.util.List; /** * TODO * * @author tudou * @version 1.0 * @date 2019/5/26 17:43 **/ public class ObjectFor3D implements Subject{ private List<Observer> observers=new ArrayList<>(); /** * 推送信息 */ String msg; @Override public void registerObserver(Observer observer) { observers.add(observer); } @Override public void removeObserver(Observer observer) { int index= observers.indexOf(observer); if(index>=0){ observers.remove(index); } } @Override public void notifyObservers() { for(Observer observer:observers){ observer.update(msg); } } /** * 主题更新消息 * @param msg */ public void setMsg(String msg) { this.msg = msg; notifyObservers(); } }4.创建相应用户
package observe; /** * TODO * * @author tudou * @version 1.0 * @date 2019/5/26 17:46 **/ public class Observer1 implements Observer { private Subject subject; public Observer1(Subject subject){ this.subject=subject; subject.registerObserver(this); } @Override public void update(String msg) { System.out.println("observer 1 接收到的推送消息:"+msg); } } package observe; /** * TODO * * @author tudou * @version 1.0 * @date 2019/5/26 17:46 **/ public class Observer2 implements Observer { private Subject subject; public Observer2(Subject subject){ this.subject=subject; subject.registerObserver(this); } @Override public void update(String msg) { System.out.println("observer 2 接收到的推送消息:"+msg); } }5.进行测试
package observe; /** * TODO * * @author tudou * @version 1.0 * @date 2019/5/26 17:48 **/ public class test { public static void main(String[] args) { //创建一个服务号 ObjectFor3D objectFor3D=new ObjectFor3D(); //向客户推送消息 Observer1 observer1=new Observer1(objectFor3D); Observer2 observer2=new Observer2(objectFor3D); objectFor3D.setMsg("第一条消息"); objectFor3D.setMsg("第二条消息"); }测试结果:
观察者模式描述了如何建立对象与对象之间的依赖关系,如何构造满足这种需求的系统。 这一模式中的关键对象是观察目标和观察者,一个目标可以有任意数目的与之相依赖的观察者,一旦目标的状态发生改变,所有的观察者都将得到通知。 作为对这个通知的响应,每个观察者都将即时更新自己的状态,以与目标状态同步,这种交互也称为发布-订阅(publishsubscribe)。目标是通知的发布者,它发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅它并接收通
当然实现方式java中已经帮我们实现了观察者模式,借助于java.util.Observable和java.util.Observer。
观察者模式在软件开发中都有广泛的应用,如本文提及到微信订阅号推送消息,电子商务网站可以在执行发送操作后给用户多个发送商品打折信息,某团队战斗游戏中某队友牺牲将给所有成员提示等等,凡是涉及到一对一或者一对多的对象交互场景都可以使用观察者模式.
https://blog.csdn.net/lmj623565791/article/details/24179699 https://design-patterns.readthedocs.io/zh_CN/latest/behavioral_patterns/observer.html