自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

設(shè)計模式系列之觀察者模式

開發(fā) 前端
觀察者模式是一種行為設(shè)計模式, 允許你定義一種訂閱機制, 可在對象事件發(fā)生時通知多個 “觀察” 該對象的其他對象。

[[410142]]

本文轉(zhuǎn)載自微信公眾號「狼王編程」,作者狼王 。轉(zhuǎn)載本文請聯(lián)系狼王編程公眾號。

大家好,我是狼王,一個愛打球的程序員

這篇讓我們來認(rèn)識一下觀察者模式

1、概述

觀察者模式是一種行為設(shè)計模式, 允許你定義一種訂閱機制, 可在對象事件發(fā)生時通知多個 “觀察” 該對象的其他對象。

2、適用場景

1)當(dāng)一個對象狀態(tài)的改變需要改變其他對象, 或?qū)嶋H對象是事先未知的或動態(tài)變化時, 可使用觀察者模式。

2) 當(dāng)應(yīng)用中的一些對象必須觀察其他對象時,可使用該模式。但僅能在有限時間內(nèi)或特定情況下使用。訂閱者可隨時加入或離開該列表。

3、實例

有以下場景:

  1. 有一個小區(qū),需要進(jìn)行核酸檢測。 
  2. 假設(shè)每個人通過關(guān)注公眾號獲取核酸檢測結(jié)果。 

發(fā)布者接口:

  1. /** 
  2.  * 發(fā)布接口 
  3.  */ 
  4. public interface IPublisher { 
  5.  
  6.     /** 
  7.      * 發(fā)布事件 
  8.      * @param event 
  9.      */ 
  10.     void publish(IEvent event); 

訂閱者接口:

  1. /** 
  2.  * 通用訂閱接口 
  3.  */ 
  4. public interface ISubscriber { 
  5.  
  6.     /** 
  7.      * 查看結(jié)果 
  8.      */ 
  9.     void look(); 

事件接口:

  1. /** 
  2.  * 通用事件接口 
  3.  */ 
  4. public interface IEvent { 
  5.  
  6.     /** 
  7.      * 打印事件信息 
  8.      */ 
  9.     void print(); 
  10.  

消息發(fā)送者

  1. /** 
  2.  * 消息發(fā)送者 
  3.  */ 
  4. public class Publisher implements IPublisher{ 
  5.  
  6.     private IEvent event; 
  7.  
  8.     private List<ISubscriber> subscribers; 
  9.  
  10.     public Publisher(IEvent event, List<ISubscriber> subscribers) { 
  11.         this.event = event; 
  12.         this.subscribers = subscribers; 
  13.     } 
  14.  
  15.     /** 
  16.      * 發(fā)布消息 
  17.      * @param event 
  18.      */ 
  19.     @Override 
  20.     public void publish(IEvent event){ 
  21.         event.print(); 
  22.     } 
  23.  
  24.     public IEvent getEvent() { 
  25.         return event; 
  26.     } 
  27.  
  28.     public void setEvent(IEvent event) { 
  29.         this.event = event; 
  30.     } 
  31.  
  32.     public List<ISubscriber> getSubscribers() { 
  33.         return subscribers; 
  34.     } 
  35.  
  36.     public void setSubscribers(List<ISubscriber> subscribers) { 
  37.         this.subscribers = subscribers; 
  38.     } 
  39.  

事件:

  1. /** 
  2.  * 檢測事件 
  3.  */ 
  4. public class CheckEvent implements IEvent{ 
  5.  
  6.     private String name
  7.  
  8.     private String result; 
  9.  
  10.     private ISubscriber subscriber; 
  11.  
  12.     public ISubscriber getSubscriber() { 
  13.         return subscriber; 
  14.     } 
  15.  
  16.     public void setSubscriber(ISubscriber subscriber) { 
  17.         this.subscriber = subscriber; 
  18.     } 
  19.  
  20.     public CheckEvent(String name) { 
  21.         this.name = name
  22.     } 
  23.  
  24.     @Override 
  25.     public void print() { 
  26.         subscriber.look(); 
  27.         System.out.println("事件名稱:" + name); 
  28.         System.out.println("事件結(jié)果:" + result); 
  29.     } 
  30.  
  31.  
  32.     public String getName() { 
  33.         return name
  34.     } 
  35.  
  36.     public void setName(String name) { 
  37.         this.name = name
  38.     } 
  39.  
  40.     public String getResult() { 
  41.         return result; 
  42.     } 
  43.  
  44.     public void setResult(String result) { 
  45.         this.result = result; 
  46.     } 

訂閱者:

  1. /** 
  2.  * 訂閱者 
  3.  */ 
  4. public class User implements ISubscriber{ 
  5.  
  6.     private String name
  7.  
  8.     public User(String name) { 
  9.         this.name = name
  10.     } 
  11.  
  12.     public String getName() { 
  13.         return name
  14.     } 
  15.  
  16.     public void setName(String name) { 
  17.         this.name = name
  18.     } 
  19.  
  20.     @Override 
  21.     public void look() { 
  22.         System.out.println("檢測姓名:" + name); 
  23.     } 

客戶端:

  1. /** 
  2.  * 測試類 
  3.  */ 
  4. public class TestDemo { 
  5.  
  6.     public static void main(String[] args) { 
  7.         //定義兩種結(jié)果 
  8.         String[] doc = {"陰性""陽性"}; 
  9.         //初始化檢測事件 
  10.         CheckEvent check = new CheckEvent("核酸檢測"); 
  11.         //初始化消息發(fā)布者 
  12.         Publisher publisher = new Publisher(check,new ArrayList<>()); 
  13.         //實例化接受檢測的用戶 
  14.         List<ISubscriber> users = new ArrayList<>(); 
  15.         for (int i = 0; i < 10; i++) { 
  16.             //初始化用戶 
  17.             User user = new User("狼王" + i); 
  18.             users.add(user); 
  19.         } 
  20.         //用戶訂閱事件 
  21.         publisher.setSubscribers(users); 
  22.         int index
  23.         //發(fā)布檢測結(jié)果 
  24.         for (int i = 0; i < 10; i++) { 
  25.             System.out.println("---------------"); 
  26.             //隨機檢測結(jié)果 
  27.             index = (int) (Math.random() * doc.length); 
  28.             check.setSubscriber(users.get(i)); 
  29.             check.setResult(doc[index]); 
  30.             //發(fā)布 
  31.             publisher.publish(check); 
  32.         } 
  33.  
  34.     } 

結(jié)果:

  1. --------------- 
  2. 檢測姓名:狼王0 
  3. 事件名稱:核酸檢測 
  4. 事件結(jié)果:陰性 
  5. --------------- 
  6. 檢測姓名:狼王1 
  7. 事件名稱:核酸檢測 
  8. 事件結(jié)果:陰性 
  9. --------------- 
  10. 檢測姓名:狼王2 
  11. 事件名稱:核酸檢測 
  12. 事件結(jié)果:陽性 
  13. --------------- 
  14. 檢測姓名:狼王3 
  15. 事件名稱:核酸檢測 
  16. 事件結(jié)果:陰性 
  17. --------------- 
  18. 檢測姓名:狼王4 
  19. 事件名稱:核酸檢測 
  20. 事件結(jié)果:陽性 
  21. --------------- 
  22. 檢測姓名:狼王5 
  23. 事件名稱:核酸檢測 
  24. 事件結(jié)果:陽性 
  25. --------------- 
  26. 檢測姓名:狼王6 
  27. 事件名稱:核酸檢測 
  28. 事件結(jié)果:陽性 
  29. --------------- 
  30. 檢測姓名:狼王7 
  31. 事件名稱:核酸檢測 
  32. 事件結(jié)果:陰性 
  33. --------------- 
  34. 檢測姓名:狼王8 
  35. 事件名稱:核酸檢測 
  36. 事件結(jié)果:陰性 
  37. --------------- 
  38. 檢測姓名:狼王9 
  39. 事件名稱:核酸檢測 
  40. 事件結(jié)果:陰性 

4、分析

代碼依賴關(guān)系如下圖所示:

分別定義了三個接口:事件接口,消息發(fā)布者接口,消息訂閱者接口每個接口有其對應(yīng)的實現(xiàn)。

這樣設(shè)計利于后續(xù)的擴展,在不同的事件和不同的訂閱者以及消息發(fā)布者,都可以進(jìn)行擴展而不影響其他。

5、總結(jié)

優(yōu)點:

1)開閉原則

2)業(yè)務(wù)代碼解耦,具體消息訂閱者和發(fā)布者沒有直接關(guān)聯(lián)。

缺點:

1)多個消費者存在的時候,可能會無法控制順序和時間較長。 

好了。今天就說到這了,我還會不斷分享自己的所學(xué)所想,希望我們一起走在成功的道路上!

 

責(zé)任編輯:武曉燕 來源: 狼王編程
相關(guān)推薦

2020-10-26 08:45:39

觀察者模式

2013-11-26 17:09:57

Android設(shè)計模式

2022-01-29 22:12:35

前端模式觀察者

2024-02-18 12:36:09

2015-11-25 11:10:45

Javascript設(shè)計觀察

2021-09-06 10:04:47

觀察者模式應(yīng)用

2021-01-21 05:34:14

設(shè)計模式建造者

2009-03-30 09:39:04

觀察者思想換位設(shè)計模式

2024-06-04 13:11:52

Python行為設(shè)計模式開發(fā)

2011-04-29 09:22:22

2012-08-27 10:52:20

.NET架構(gòu)觀察者模式

2021-03-29 07:14:28

Spring觀察者模式

2021-01-25 05:38:04

設(shè)計原理VueSubject

2024-12-03 09:34:35

觀察者模 式編程Javav

2022-05-09 10:50:13

觀察者模式設(shè)計模式

2020-10-20 13:33:00

建造者模式

2020-11-05 09:38:07

中介者模式

2021-10-26 00:21:19

設(shè)計模式建造者

2021-06-09 08:53:34

設(shè)計模式策略模式工廠模式

2012-01-13 15:59:07

點贊
收藏

51CTO技術(shù)棧公眾號