偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

[[410142]]

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

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

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

1、概述

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

2、適用場(chǎng)景

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

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

3、實(shí)例

有以下場(chǎng)景:

  1. 有一個(gè)小區(qū),需要進(jìn)行核酸檢測(cè)。 
  2. 假設(shè)每個(gè)人通過關(guān)注公眾號(hào)獲取核酸檢測(cè)結(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.  * 檢測(cè)事件 
  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("檢測(cè)姓名:" + name); 
  23.     } 

客戶端:

  1. /** 
  2.  * 測(cè)試類 
  3.  */ 
  4. public class TestDemo { 
  5.  
  6.     public static void main(String[] args) { 
  7.         //定義兩種結(jié)果 
  8.         String[] doc = {"陰性""陽性"}; 
  9.         //初始化檢測(cè)事件 
  10.         CheckEvent check = new CheckEvent("核酸檢測(cè)"); 
  11.         //初始化消息發(fā)布者 
  12.         Publisher publisher = new Publisher(check,new ArrayList<>()); 
  13.         //實(shí)例化接受檢測(cè)的用戶 
  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ā)布檢測(cè)結(jié)果 
  24.         for (int i = 0; i < 10; i++) { 
  25.             System.out.println("---------------"); 
  26.             //隨機(jī)檢測(cè)結(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. 檢測(cè)姓名:狼王0 
  3. 事件名稱:核酸檢測(cè) 
  4. 事件結(jié)果:陰性 
  5. --------------- 
  6. 檢測(cè)姓名:狼王1 
  7. 事件名稱:核酸檢測(cè) 
  8. 事件結(jié)果:陰性 
  9. --------------- 
  10. 檢測(cè)姓名:狼王2 
  11. 事件名稱:核酸檢測(cè) 
  12. 事件結(jié)果:陽性 
  13. --------------- 
  14. 檢測(cè)姓名:狼王3 
  15. 事件名稱:核酸檢測(cè) 
  16. 事件結(jié)果:陰性 
  17. --------------- 
  18. 檢測(cè)姓名:狼王4 
  19. 事件名稱:核酸檢測(cè) 
  20. 事件結(jié)果:陽性 
  21. --------------- 
  22. 檢測(cè)姓名:狼王5 
  23. 事件名稱:核酸檢測(cè) 
  24. 事件結(jié)果:陽性 
  25. --------------- 
  26. 檢測(cè)姓名:狼王6 
  27. 事件名稱:核酸檢測(cè) 
  28. 事件結(jié)果:陽性 
  29. --------------- 
  30. 檢測(cè)姓名:狼王7 
  31. 事件名稱:核酸檢測(cè) 
  32. 事件結(jié)果:陰性 
  33. --------------- 
  34. 檢測(cè)姓名:狼王8 
  35. 事件名稱:核酸檢測(cè) 
  36. 事件結(jié)果:陰性 
  37. --------------- 
  38. 檢測(cè)姓名:狼王9 
  39. 事件名稱:核酸檢測(cè) 
  40. 事件結(jié)果:陰性 

4、分析

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

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

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

5、總結(jié)

優(yōu)點(diǎn):

1)開閉原則

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

缺點(diǎn):

1)多個(gè)消費(fèi)者存在的時(shí)候,可能會(huì)無法控制順序和時(shí)間較長(zhǎng)。 

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

 

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

2020-10-26 08:45:39

觀察者模式

2013-11-26 17:09:57

Android設(shè)計(jì)模式

2022-01-29 22:12:35

前端模式觀察者

2024-02-18 12:36:09

2015-11-25 11:10:45

Javascript設(shè)計(jì)觀察

2021-09-06 10:04:47

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

2021-01-21 05:34:14

設(shè)計(jì)模式建造者

2009-03-30 09:39:04

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

2024-06-04 13:11:52

Python行為設(shè)計(jì)模式開發(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è)計(jì)原理VueSubject

2024-12-03 09:34:35

觀察者模 式編程Javav

2020-11-05 09:38:07

中介者模式

2021-10-26 00:21:19

設(shè)計(jì)模式建造者

2020-10-20 13:33:00

建造者模式

2022-05-09 10:50:13

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

2012-01-13 15:59:07

2021-06-09 08:53:34

設(shè)計(jì)模式策略模式工廠模式
點(diǎn)贊
收藏

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