1、什么是观察者模式
在对对象之间定义了一对多的依赖,这样一来,当一个对象改变状态, 依赖它的对象会收到通知并自动更新。
2、观察者模式的应用场景
Zookeeper事件通知节点、消息订阅通知、分布式配置中心

抽象被观察者角色:也就是一个抽象主题,它把所有对观察者对象的引用保存在一 个集合中,每个主题都可以有任意数量的观察者。抽象主题提 供一个接口,可以增加和删除观察者角色。一般用一个抽象类 和接口来实现。
抽象观察者角色:为所有的具体观察者定义一个接口,在得到主题通知时更新自 己。
具体被观察者角色:也就是一个具体的主题,在集体主题的内部状态改变时,所有 登记过的观察者发出通知。
具体观察者角色:实现抽象观察者角色所需要的更新接口,一边使本身的状态与制 图的状态
3、具体实现
简单实现
//抽象观察者public interface ObServer {/*** 更新消息内容** @param message* @return*/public void update(String message);}//抽象主题者public interface AbstractSubject {/*** 添加obServer** @param obServer*/void addObServer(ObServer obServer);/*** 移除obServer** @param obServer*/void removeObServer(ObServer obServer);/*** 通知所有的notifyObServerAll** @param message*/void notifyObServerAll(String message);/*** 设置更新内容*/void setNtifyMessage(String message);}//具体主题public class WeChatSubject implements AbstractSubject {/*** 存放所有的ObServer*/private List<ObServer> listObServer = new ArrayList<ObServer>();/*** 更新的内容*/private String message;public void addObServer(ObServer obServer) {listObServer.add(obServer);}public void removeObServer(ObServer obServer) {listObServer.remove(obServer);}public void notifyObServerAll(String message) {for (int i = 0; i < listObServer.size(); i++) {ObServer obServer = listObServer.get(i);obServer.update(message);}}public void setNtifyMessage(String message) {this.message = message;System.out.println("微信公众号设置message:" + message);notifyObServerAll(message);}}//具体观察者public class UserObServer implements ObServer {/*** 订阅者用户名称*/private String name;/*** 发送内容*/private String message;public UserObServer(String name) {this.name = name;}public void update(String message) {this.message = message;read();}public void read() {System.out.println(name + ",老师收到推送消息:" + message);}}//运行测试// 1.注册主题AbstractSubject weChatSubject = new WeChatSubject();// 2.添加观察者 订阅主题weChatSubject.addObServer(new UserObServer("小薇"));weChatSubject.addObServer(new UserObServer("小敏"));// 3.设置发送消息weChatSubject.setNtifyMessage("好好敲代码,踏踏实实做自己");
JDK自带观察实现消息发送
//自定义主题public class MessageObServable extends Observable {@Overridepublic void notifyObservers(Object arg) {// 1.修改状态为可以群发setChanged();// 2.调用父类的notifyObservers 群发消息super.notifyObservers(arg);}}//自定义观察者public class WechatObServer implements Observer {public void update(Observable o, Object arg) {System.out.println("用户下单成功,发送微信体醒内容:" + arg);}}public class EmailObServer implements Observer {public void update(Observable o, Object arg) {System.out.println("用户下单成功,发送邮件提醒内容:" + arg);}}public class SmsObServer implements Observer {public void update(Observable o, Object arg) {System.out.println("用户下单成功,发送短信提醒内容:" + arg);}}public class TestJdkObServer {public static void main(String[] args) {// 1.创建具体的主题Observable observable = new MessageObServable();// 2. 注册观察者observable.addObserver(new SmsObServer());observable.addObserver(new WechatObServer());observable.addObserver(new EmailObServer());// 3.群发消息observable.notifyObservers("恭喜以1399元购买蚂蚁课堂永久会员一份");}/*** Spring 中项目启动的时候 将这些观察者注册到 主题中 调用notifyObservers群发消息*/}
Spring封装事件监听
public class OrderCreateEvent extends ApplicationEvent {private JSONObject jsonObject;public OrderCreateEvent(Object source, JSONObject jsonObject) {super(source);this.jsonObject = jsonObject;}public JSONObject getJsonObject() {return jsonObject;}public void setJsonObject(JSONObject jsonObject) {this.jsonObject = jsonObject;}}@Componentpublic class EmailListener implements ApplicationListener<OrderCreateEvent> {@Override@Asyncpublic void onApplicationEvent(OrderCreateEvent event) {System.out.println(Thread.currentThread().getName()+"发送邮件内容:" + event.getJsonObject().toJSONString());}}@Componentpublic class SmsListener implements ApplicationListener<OrderCreateEvent> {@Override@Asyncpublic void onApplicationEvent(OrderCreateEvent event) {System.out.println(Thread.currentThread().getName() + "发送短信内容:" + event.getJsonObject().toJSONString());}}@RequestMapping("/addOrder")public String addOrder() {System.out.println("创建订单...");// 3.组装消息内容JSONObject jsonObject = new JSONObject();jsonObject.put("email", "644064779@qq.com");jsonObject.put("phone", "15123456789");jsonObject.put("text", "恭喜您以1399.00元购买蚂蚁课堂永久会员.");OrderCreateEvent orderCreateEvent = new OrderCreateEvent(this, jsonObject);applicationContext.publishEvent(orderCreateEvent);return "success";}
