在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象收到通知并自动更新web
其实就是发布订阅模式,发布者发布消息,订阅者获取消息,订阅了就能收到消息,没订阅就收不到消息。spring
Zookeeper事件通知节点、消息订阅通知、安卓开发事件注册json
抽象被观察者角色:也就是一个抽象主题,它把全部对观察者对象的引用保存在一个集合中,每一个主题均可以有任意数量的观察者。抽象主题提供一个接口,能够增长和删除观察者角色。通常用一个抽象类和接口来实现。设计模式
抽象观察者角色:为全部的具体观察者定义一个接口,在获得主题通知时更新本身。微信
具体被观察者角色:也就是一个具体的主题,在集体主题的内部状态改变时,全部登记过的观察者发出通知。app
具体观察者角色:实现抽象观察者角色所须要的更新接口,一边使自己的状态与制图的状态相协调。ide
public interface ObServer { /** * 更新消息内容 */ public void update(String message); }
public interface AbstractSubject { /** * 添加obServer */ void addObServer(ObServer obServer); /** * 移除obServer */ void removeObServer(ObServer obServer); /** * 通知全部的notifyObServerAll */ 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); } }
public class App { public static void main(String[] args) { // 1.注册主题 AbstractSubject weChatSubject = new WeChatSubject(); // 2.添加观察者 订阅主题 weChatSubject.addObServer(new UserObServer("小须")); weChatSubject.addObServer(new UserObServer("小霞")); // 3.设置发送消息 weChatSubject.setNtifyMessage("消息内容:小须喜欢小霞"); } }
微信公众号设置message:消息内容:小须喜欢小霞
小须同窗收到推送消息:消息内容:小须喜欢小霞
小霞同窗收到推送消息:消息内容:小须喜欢小霞spring-boot
(1). Observable类追踪全部的观察者,并通知他们。
(2). Observer这个接口看起来很熟悉,它和咱们以前写的类几乎同样。测试
public class MessageObServable extends Observable { @Override public void notifyObservers(Object arg) { // 1.改变数据 setChanged(); // 2.通知全部的观察者改变 super.notifyObservers(arg); } }
public class EmailObServer implements Observer { public void update(Observable o, Object arg) { // 1.获取主题 MessageObServable messageObServable = (MessageObServable) o; System.out.println("发送邮件内容:" + arg); } } public class SmsObServer implements Observer { public void update(Observable o, Object arg) { System.out.println("发送短信内容:" + arg); } }
public class JdkObServer { public static void main(String[] args) { //1.建立主题 MessageObServable messageObServable = new MessageObServable(); // 2.添加订阅者 messageObServable.addObserver(new EmailObServer()); messageObServable.addObserver(new SmsObServer()); // 3.组装消息内容 JSONObject jsonObject = new JSONObject(); jsonObject.put("email", "11111111@qq.com"); jsonObject.put("phone", "11111111111"); jsonObject.put("text", "小须喜欢小霞."); messageObServable.notifyObservers(jsonObject.toJSONString()); } }
pom依赖this
<dependencies> <!-- fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.30</version> </dependency> </dependencies>
结果
发送短信内容:{"phone":"11111111111","text":"小须喜欢小霞.","email":"11111111@qq.com"}
发送邮件内容:{"phone":"11111111111","text":"小须喜欢小霞.","email":"11111111@qq.com"}
OrderCreateEvent
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; } }
EmailListener
@Component public class EmailListener implements ApplicationListener<OrderCreateEvent> { @Override @Async public void onApplicationEvent(OrderCreateEvent event) { System.out.println(Thread.currentThread().getName()+"发送邮件内容:" + event.getJsonObject().toJSONString()); } }
SmsListener
@Component public class SmsListener implements ApplicationListener<OrderCreateEvent> { @Override @Async public void onApplicationEvent(OrderCreateEvent event) { System.out.println(Thread.currentThread().getName() + "发送短信内容:" + event.getJsonObject().toJSONString()); } }
controller
@RestController public class OrderController { @Autowired private ApplicationContext applicationContext; @RequestMapping("/sendMsg") public String sendMsg() { // 3.组装消息内容 JSONObject jsonObject = new JSONObject(); jsonObject.put("email", "11111111@qq.com"); jsonObject.put("phone", "11111111111"); jsonObject.put("text", "小须喜欢小霞."); OrderCreateEvent orderCreateEvent = new OrderCreateEvent(this, jsonObject); applicationContext.publishEvent(orderCreateEvent); return "success"; } }
AppStart
@SpringBootApplication @EnableAsync public class AppStart { public static void main(String[] args) { SpringApplication.run(AppStart.class,args); } }
pom
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.1.RELEASE</version> </parent> <dependencies> <!-- fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.30</version> </dependency> <!-- SpringBoot-整合Web组件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
结果输出
SimpleAsyncTaskExecutor-2发送短信内容:{"phone":"11111111111","text":"小须喜欢小霞.","email":"11111111@qq.com"}
SimpleAsyncTaskExecutor-1发送邮件内容:{"phone":"11111111111","text":"小须喜欢小霞.","email":"11111111@qq.com“}
版权@须臾之余https://my.oschina.net/u/3995125