在對象之間定義一對多的依賴,這樣一來,當一個對象改變狀態,依賴它的對象收到通知並自動更新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