java设计模式之观察者模式简单解读
作者:欢欢2776479680
前言
首先,弄明白两组概念: 观察者(Observer)与被观察者(subject)、发布者(publicsher)与订阅者(subscriber)。这是相似的两组概念,讲的时候,要对应于各自所在的组,不要弄混了。
在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。(这和前端vue的思想相同) 观察者模式说白了,其实就是发布订阅模式,发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。
思路
- 抽象出观察者接口
- 抽象出被观察者接口
- 观察者类实现观察者接口
- 被观察者类实现被观察者接口(被观察者持有观察者的一个队列)
具体实现
实现时,可以不一步到位,在遇到问题的时候,你也许就知道该怎么做了
package com.wanmei.meishu.ms; import java.util.ArrayList; import java.util.List; //观察者接口 interface Observable{ //观察 void addSub(ISubject sub); //取消观察 void removeSub(ISubject sub,String msg); //读取消息 void watch(String msg); //获取观察者名称 String getName(); } //观察者实例 class Observer implements Observable { private String name; public Observer(String name) { this.name = name; } @Override public void addSub(ISubject sub){ sub.addObserver(this); System.out.println("Observer:用户【"+this.name+"】 订阅了消息"); } @Override public void removeSub(ISubject sub,String msg){ sub.removeObserver(this); System.out.println("Observer:用户【"+this.name+"】 取消了订阅消息," + (msg == null ? "" : ("并说:" + msg))); } @Override public void watch(String msg) { System.out.println("Observer:用户【"+this.name+"】读取到的订阅消息是:" + msg); } public String getName() { return name; } } //被观察者接口 interface ISubject{ //给观察者们发送消息 void sendMsg(String msg); //添加一个观察者 void addObserver(Observable user); //取消一个观察者 void removeObserver(Observable user); } //被观察者实现方式 class SubjectImpl implements ISubject{ //持有观察者队列 private List<Observable> observerList; //添加一个观察者 public synchronized void addObserver(Observable user){ if(observerList == null){ observerList = new ArrayList<Observable>(); } observerList.add(user); String str = ""; for (Observable observable : observerList) { str+= observable.getName()+"、"; } System.out.println("ISubject:目前已有用户:" + str.substring(0, str.length()-1)); } //取消一个观察者 public void removeObserver(Observable user){ observerList.remove(user); if(!observerList.isEmpty()){ String str = ""; for (Observable observable : observerList) { str+= observable.getName()+"、"; } System.out.println("ISubject:目前剩余用户:" + str.substring(0, str.length()- 1)); } } @Override public void sendMsg(String msg) { if(!observerList.isEmpty()){ System.out.println("ISubject:发送消息:" + msg); for (Observable observable : observerList) { observable.watch(msg); } } } } public class ObserverTest { public static void main(String[] args) { ISubject sub = new SubjectImpl(); //第一个观察者 Observable u1 = new Observer("吴文俊"); u1.addSub(sub); Observable u2 = new Observer("吴华云"); u2.addSub(sub); Observable u3 = new Observer("李爪哇"); u3.addSub(sub); sub.sendMsg("PHP是世界上最好的语言!"); u3.removeSub(sub,"去死吧,PHP"); sub.sendMsg("PHP是世界上最好的语言!"); } }
运行结果:
ISubject:目前已有用户:吴文俊
Observer:用户【吴文俊】 订阅了消息
ISubject:目前已有用户:吴文俊、吴华云
Observer:用户【吴华云】 订阅了消息
ISubject:目前已有用户:吴文俊、吴华云、李爪哇
Observer:用户【李爪哇】 订阅了消息
ISubject:发送消息:PHP是世界上最好的语言!
Observer:用户【吴文俊】读取到的订阅消息是:PHP是世界上最好的语言!
Observer:用户【吴华云】读取到的订阅消息是:PHP是世界上最好的语言!
Observer:用户【李爪哇】读取到的订阅消息是:PHP是世界上最好的语言!
ISubject:目前剩余用户:吴文俊、吴华云
Observer:用户【李爪哇】 取消了订阅消息并说:去死吧,PHP
ISubject:发送消息:PHP是世界上最好的语言!
Observer:用户【吴文俊】读取到的订阅消息是:PHP是世界上最好的语言!
Observer:用户【吴华云】读取到的订阅消息是:PHP是世界上最好的语言!
到此这篇关于java设计模式之观察者模式简单解读的文章就介绍到这了,更多相关java观察者模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!