深入理解設計模式-行為型之觀察者

概述

觀察者模式(Observer Pattern)是一種行為型設計模式,它定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽一個主題對象,當主題對象發生變化時,所有依賴于它的觀察者對象都會得到通知并更新。

在觀察者模式中,有兩個主要角色:

  • Subject(主題):維護一個觀察者列表,提供方法用于添加、刪除和通知觀察者。
  • Observer(觀察者):定義一個接口,用于接收主題對象的通知,以便在主題發生變化時更新自身狀態。

電商系統的應用

促銷通知的例子:
假設我們有一個電商系統,當某件商品有促銷活動時,需要通知所有訂閱了該商品的用戶。在這個例子中,商品是主題,用戶是觀察者

首先,我們創建一個Subject接口,表示主題:

public interface Subject {void registerObserver(Observer o);//添加void removeObserver(Observer o);//刪除void notifyObservers();//通知
}

接下來,我們創建一個Observer接口,表示觀察者:

public interface Observer {void update(String discountInfo);
}

現在,我們創建一個具體的主題,如Product,實現Subject接口:

public class Product implements Subject {private ArrayList<Observer> observers;// 折扣消息private String discountInfo;public Product() {observers = new ArrayList<>();}public void registerObserver(Observer o) {observers.add(o);}public void removeObserver(Observer o) {int index = observers.indexOf(o);if (index >= 0) {observers.remove(index);}}public void notifyObservers() {for (Observer o : observers) {o.update(discountInfo);}}public void discountChanged() {notifyObservers();}public void setDiscountInfo(String discountInfo) {this.discountInfo = discountInfo;discountChanged();}
}

接著,我們創建一個具體的觀察者,如User,實現Observer接口:

public class User implements Observer {private String userName;private String discountInfo;private Subject product;public User(String userName, Subject product) {this.userName = userName;this.product = product;product.registerObserver(this);}public void update(String discountInfo) {this.discountInfo = discountInfo;display();}public void display() {System.out.println("用戶 " + userName + " 收到促銷通知: " + discountInfo);}
}

2個接口,2個具體的類。
現在我們可以創建一個Product實例(主題)并向其注冊User觀察者。當Product的促銷信息發生變化時,User會收到通知并顯示促銷信息。

public class Main {public static void main(String[] args) {//注冊2個用戶User user1 = new User("張三", product);User user2 = new User("李四", product);// 模擬商品促銷信息更新Product product = new Product();product.setDiscountInfo("本周末滿100減50");product.setDiscountInfo("雙十一全場5折");}
}

在這個例子中,我們創建了一個Product實例并向其注冊了兩個User觀察者。當Product的促銷信息發生變化時,所有觀察者都會收到通知并更新自己的顯示。這個例子展示了觀察者模式在電商系統中的應用,如何實現商品和用戶之間的交互。

源碼應用

觀察者模式在許多Java框架和庫中都有應用,以下是一些常見的示例:

  • Java 內置類庫:Java內置了一些使用觀察者模式的類,例如 java.util.Observable 和 java.util.Observer。雖然在較新的Java版本中已經不推薦使用,但它們仍然是觀察者模式的一個例子。你可以通過擴展 Observable 類并實現 Observer 接口來創建自己的觀察者模式。

  • Swing GUI 框架:Swing中的事件監聽就是觀察者模式的應用。比如,你可以為按鈕添加動作監聽器,當按鈕被點擊時,監聽器會收到通知并執行相應的操作。

  • Spring Framework:Spring框架廣泛使用觀察者模式,特別是在事件驅動編程中。例如,Spring的事件機制允許你在應用中發布和監聽事件,當某些事件發生時,注冊的監聽器會收到通知并執行相應的邏輯。

  • Android開發:Android中的事件處理也是觀察者模式的應用,例如,你可以為按鈕添加點擊事件監聽器,當按鈕被點擊時,監聽器會收到通知。

這些只是一些例子,觀察者模式在許多框架和應用中都有廣泛的應用。它提供了一種松耦合的方式,允許不同部分的代碼能夠在發生變化時保持同步,從而實現更加靈活和可維護的程序。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/39010.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/39010.shtml
英文地址,請注明出處:http://en.pswp.cn/news/39010.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何安裝Python?

如何安裝Python&#xff1f; 安裝Python非常簡單&#xff0c;讓我們一步步來進行。 1. 訪問官方網站 首先&#xff0c;您需要訪問Python官方網站&#xff08;https://www.python.org/&#xff09;。在首頁上&#xff0c;您會看到一個大大的「Downloads」按鈕&#xff0c;點擊…

【Redis實踐篇】使用Redisson 優雅實現項目實踐過程中的5種場景

文章目錄 1.前言2.使用方式1. 添加Redisson依賴&#xff1a;2. 配置Redis連接信息3. 使用場景3.1. 分布式鎖3.2. 限流器&#xff08;Rate Limiter&#xff09;3.3. 可過期的對象&#xff08;Expirable Object&#xff09;3.4. 信號量&#xff08;Semaphore&#xff09;3.5. 分布…

ChatGPT在智能文檔搜索和信息抽取中的應用如何?

智能文檔搜索和信息抽取是信息檢索和知識管理領域中的關鍵問題&#xff0c;而ChatGPT作為一種強大的自然語言處理模型&#xff0c;正在這些領域發揮越來越重要的作用。在大數據時代&#xff0c;文檔數量龐大&#xff0c;信息量巨大&#xff0c;有效地搜索和抽取信息變得至關重要…

spfa判斷負環

思路&#xff1a; &#xff08;1&#xff09;負環&#xff1a;區別于正環&#xff0c;在求最短路過程中&#xff0c;正環會繞路&#xff0c;故不會被討論&#xff0c;而負環會不斷讓路總權更短&#xff0c;會讓算法不斷循環&#xff1b; &#xff08;2&#xff09;于是考慮統…

JVM---垃圾回收算法介紹

目錄 分代收集理論 三種垃圾回收算法 標記-清除算法&#xff08;最基礎的、基本不用&#xff09; 標記-復制算法 標記-整理算法 正式因為jvm有了垃圾回收機制&#xff0c;作為java開發者不會去特備關注內存&#xff0c;不像C和C。 優點&#xff1a;開發門檻低、安全 缺點…

windows Socket簡單編程實例

服務端 #include <winsock2.h> #include <string.h> #include <stdio.h> #include <stdlib.h>#pragma comment(lib, "Ws2_32.lib")void error_handing(const char* message) {fputs(message, stderr);fputc(\n, stderr);exit(1); } int mai…

任我行CRM系統存在 SQL注入漏洞[2023-HW]

任我行CRM系統存在 SQL注入漏洞 一、 產品簡介二、 漏洞概述三、 復現環境四、 漏洞復現小龍POC又是一通哈拉少 五、 修復建議 免責聲明&#xff1a;請勿利用文章內的相關技術從事非法測試&#xff0c;由于傳播、利用此文所提供的信息或者工具而造成的任何直接或者間接的后果及…

學習ts(二)數據類型(接口和對象類型、數組類型)

interface 重名會重合到一起 如果兩個interface名稱相同&#xff0c;會把兩個合到一起 重復定義同一個需要類型相同 不能多或者減少屬性 設置任意key 當定義接口返回數據時&#xff0c;我們不確定接口會返回多少&#xff0c;知道所需要的固定屬性&#xff0c;其余屬性可以…

學習筆記十四:K8S最小調度單元POD概述

K8S最小調度單元POD概述 k8s核心資源Pod介紹Pod是什么Pod如何管理多個容器Pod網絡Pod存儲代碼自動發版更新收集業務日志 Pod工作方式自主式Pod控制器管理的Pod(防誤刪除) 如何基于Pod運行應用 k8s核心資源Pod介紹 K8s官方文檔&#xff1a;https://kubernetes.io/ K8s中文官方文…

【博客692】grafana如何解決step動態變化時可能出現range duration小于step

grafana如何解決step動態變化時可能出現range duration小于step 1、grafana中的step和resolution grafana中的 “step” grafana本身是沒有提供step參數的&#xff0c;因為儀表盤根據查詢數據區間以及儀表盤線條寬度等&#xff0c;對于不同查詢&#xff0c;相同的step并不能…

校園外賣小程序怎么做

校園外賣小程序是為滿足校園內學生和教職員工的外賣需求而開發的一種應用程序。它涵蓋了從用戶端、商家端、騎手端、電腦管理員到小票打印、多商戶入駐等多個方面的功能&#xff0c;以下將逐一介紹。 1. 用戶端功能&#xff1a;校園外賣小程序為用戶提供了便捷的訂餐和外賣服務…

Zmq適配Win7 SP0 / Win XP/ Win 2k

1.目的 由于發布版本的libzmq使用了較多新的系統特性&#xff0c;導致在低版本windows平臺上無法使用。 因此&#xff0c;需要對zmq源碼進行修改以適配低版本的系統&#xff0c;如Win7 SP0&#xff0c;Win XP&#xff0c;Win2003等等。 2.Win7 SP0 #if defined ZMQ_HAVE_WIN…

深入理解epoll

文章目錄 概述1. epoll_create - 創建一個epoll實例2. epoll_ctl - 控制epoll實例的事件結構體介紹events取值&#xff1a;data&#xff1a; 聯合體&#xff08;共用體&#xff09;&#xff1a; 3. epoll_wait - 等待事件發生偽代碼總結 概述 在網絡編程中&#xff0c;高效地處…

每天一道leetcode:797. 所有可能的路徑(圖論中等深度優先遍歷)

今日份題目&#xff1a; 給你一個有 n 個節點的 有向無環圖&#xff08;DAG&#xff09;&#xff0c;請你找出所有從節點 0 到節點 n-1 的路徑并輸出&#xff08;不要求按特定順序&#xff09; graph[i] 是一個從節點 i 可以訪問的所有節點的列表&#xff08;即從節點 i 到節…

c++11 explicit關鍵字的作用

explicit 在C中&#xff0c;explicit關鍵字用來修飾類的構造函數&#xff0c;被修飾的構造函數的類&#xff0c;不能發生相應的隱式類型轉換&#xff0c;只能以顯示的方式進行類型轉換。因為無參構造函數和多參構造函數本身就是顯示調用的。再加上explicit關鍵字也沒有什么意義…

?五金件機器視覺定位?并獲取外觀輪廓軟硬件視覺方案

【檢測目的】 五金件機器視覺定位&#xff0c;視覺檢測五金件輪廓并矯正五金件位置進行涂油 【客戶要求】 FOV:540*400mm 【拍攝與處理效圖一】 【拍攝與處理效圖二】 【實驗原理及說明】 【方案評估】 根據目前的圖像和處理結果來看&#xff0c;可以檢測出產品輪廓并進行位置…

HCIP-OpenStack搭建

1、OpenStack概述 OpenStack是一種云操作系統&#xff0c;OpenStack是虛擬機、裸金屬和容器的云基礎架構。可控制整個數據中心的大型計算、存儲和網絡資源池&#xff0c;所有資源都通過具有通用身份驗證機制的API進行管理和配置。管理員也可通過Web界面控制&#xff0c;同時授…

Qt 之 QPushButton,信號與槽機制

文章目錄 前言一、QPushButton二、信號與槽機制總結 前言 一、QPushButton 當我們開發基于Qt框架的圖形用戶界面&#xff08;GUI&#xff09;應用程序時&#xff0c;經常需要在界面上添加按鈕來實現用戶交互。Qt提供了一個名為 QPushButton 的類作為按鈕控件的實現。QPushButt…

基于RoCE的應用程序的MTU注意事項

目錄 基于RoCE的應用程序的MTU注意事項 探測網絡中的MTU設置 概要 原文 MTU測試結果 DOC: CentOS安裝tshark抓包工具 基于RoCE的應用程序的MTU注意事項 原文&#xff1a;https://support.mellanox.com/s/article/MLNX2-117-1682kn InfiniBand協議最大傳輸單元&#xff…

WSL2 Ubuntu子系統安裝OpenCV

文章目錄 前言一、&#xfeff;基本概念二、操作步驟1.下載源碼2.安裝依賴3.運行編譯4.配置路徑 前言 OpenCV用C語言編寫&#xff0c;它的主要接口也是C語言&#xff0c;但是依然保留了大量的C語言接口。該庫也有大量的Python, Java and MATLAB/OCTAVE (版本2.5)的接口。這些語…