監聽器模式

1. 問題背景

假設我們有一個 銀行賬戶管理系統,該系統需要監控用戶賬戶余額的變動,并在發生變動時,自動執行一些相關的操作,比如發送 余額變動通知(如短信、郵件等)。為了實現這一功能,我們希望通過一個靈活且松耦合的方式來處理余額變動通知。

2. 監聽器

這個問題當中,當用戶的余額發生變化的一瞬間,我們就希望執行發送短信、郵件等功能,在不不知道監聽器的時候,你也許會直接在用戶余額發生變化的時候把相應的業務邏輯寫在那里,這樣有好處但是也有壞處,好處就是代碼邏輯性強,壞處就是高耦合且不好維護

所以想到余額變化的時候代碼那個地方只調用有一個接口,真正執行的時候再把實現注入進去,這個就是監聽器

3. 手搓代碼環節

3.1 項目結構

3.2?AccountBalanceListener

public?interface?AccountBalanceListener?{void?onBalanceChange(double?newBalance);??//?余額變化時的響應方法?可以設置發短信或者郵件
}

3.3?BalanceChangeNotifier

public?class?BalanceChangeNotifier?implements?AccountBalanceListener{@Overridepublic?void?onBalanceChange(double?newBalance)?{//?假設發送一條通知(如發送短信或電子郵件)System.out.println("發送郵件?新的余額是:"?+?newBalance);}
}

3.4?BankAccount

public?class?BankAccount?{private?double?balance;??//?賬戶余額private?AccountBalanceListener?listener;??//?持有監聽器的引用//?構造方法public?BankAccount(double?balance)?{this.balance?=?balance;}//?設置余額監聽器public?void?setListener(AccountBalanceListener?listener)?{this.listener?=?listener;}//?修改余額public?void?changeBalance(double?amount)?{this.balance?+=?amount;??//?更新余額if?(listener?!=?null)?{listener.onBalanceChange(this.balance);??//?觸發余額變化事件}}//?獲取當前余額public?double?getBalance()?{return?balance;}
}

3.5 Main

public?class?Main?{public?static?void?main(String[]?args)?{//?創建銀行賬戶對象BankAccount?account?=?new?BankAccount(1000.0);//?創建余額變動通知器BalanceChangeNotifier?notifier?=?new?BalanceChangeNotifier();//?設置賬戶的余額監聽器account.setListener(notifier);//?模擬賬戶余額變動account.changeBalance(-200.0);account.changeBalance(500.0);}
}

4. 總結

4.1 運行截圖

image.png

4.2 一些心得

監聽器和觀察者有點像,但還是有不同的

  1. 監聽器是狀態發生變化立刻就執行業務邏輯,觀察者則是狀態發生變化只是通知各個訂閱者,狀態發生變化了,業務邏輯還需要他們自己去執行

  2. 監聽器往往是1對1,觀察者則是1對多 監聽器往往用于ui相關,比如按鈕的單擊事件,觀察者更多的是偏向于業務邏輯相關

4.3 A i有話說

image.png

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

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

相關文章

帕魯杯應急響應賽題:知攻善防實驗室

一、背景信息 在這個跳躍的數字舞臺上,數據安全成了政企單位穩航的重要壓艙石。某政企單位,作為一艘駛向未來 的巨輪,對數據的把控絲毫不敢松懈。眼下,我們即將啟航一場無與倫比的探險——“信息安全探索之 旅”。 這趟旅程的目的…

【硬核數學】2.2 深度學習的“微積分引擎”:自動微分與反向傳播《從零構建機器學習、深度學習到LLM的數學認知》

歡迎來到本系列的第七篇文章。在上一章,我們用張量武裝了我們的線性代數知識,學會了如何描述和操作神經網絡中的高維數據流。我們知道,一個神經網絡的“前向傳播”過程,就是輸入張量經過一系列復雜的張量運算(矩陣乘法…

DAY 45 Tensorboard使用介紹

浙大疏錦行https://blog.csdn.net/weixin_45655710知識點回顧: tensorboard的發展歷史和原理tensorboard的常見操作tensorboard在cifar上的實戰:MLP和CNN模型 作業:對resnet18在cifar10上采用微調策略下,用tensorboard監控訓練過程…

2023年全國碩士研究生招生考試英語(一)試題總結

文章目錄 題型與分值分布完形填空錯誤 1:考察連詞 or 前后內容之間的邏輯關系錯誤2:錯誤3:錯誤4:這個錯得最有價值,因為壓根沒讀懂錯誤5:學到的短語: 仔細閱讀排序/新題型翻譯小作文大作文 題型…

react-數據Mock實現——json-server

什么是mock? 在前后端分離的開發模式下,前端可以在沒有實際后端接口的支持下先進行接口數據的模擬,進行正常的業務功能開發 json-server實現數據Mock json-server是一個node的包,可以在不到30秒內獲得零編碼的完整Mock服務 實現…

使用POI導入解析excel文件

首先校驗 /*** 校驗導入文件* param file 上傳的文件* return 校驗結果,成功返回包含成功狀態的AjaxResult,失敗返回包含錯誤信息的AjaxResult*/private AjaxResult validateImportFile(MultipartFile file) {if (file.isEmpty()) {return AjaxResult.er…

從0開始學習計算機視覺--Day06--反向傳播算法

盡管解析梯度可以讓我們省去巨大的計算量,但如果函數比較復雜,對這個損失函數進行微分計算會變得很困難。我們通常會用反向傳播技術來遞歸地調用鏈式法則來計算向量每一個方向上的梯度。具體來說,我們將整個計算過程的輸入與輸入具體化&#…

企業流程知識:《學習觀察:通過價值流圖創造價值、消除浪費》讀書筆記

《學習觀察:通過價值流圖創造價值、消除浪費》讀書筆記 作者:邁克魯斯(Mike Rother),約翰舒克(John Shook) 出版時間:1999年 歷史地位:精益生產可視化工具的黃金標準&am…

Day02_C語言IO進程線程

01.思維導圖 02.將當前的時間寫入到time. txt的文件中,如果ctrlc退出之后,在再次執行支持斷點續寫 1.2022-04-26 19:10:20 2.2022-04-26 19:10:21 3.2022-04-26 19:10:22 //按下ctrlc停止,再次執行程序 4.2022-04-26 20:00:00 5.2022-04-26 2…

FFmpeg中TS與MP4格式的extradata差異詳解

在視頻處理中,extradata是存儲解碼器初始化參數的核心元數據,直接影響視頻能否正確解碼。本文深入解析TS和MP4格式中extradata的結構差異、存儲邏輯及FFmpeg處理方案。 📌 一、extradata的核心作用 extradata是解碼必需的參數集合&#xff0…

【CV數據集介紹-40】Cityscapes 數據集:助力自動駕駛的語義分割神器

🧑 博主簡介:曾任某智慧城市類企業算法總監,目前在美國市場的物流公司從事高級算法工程師一職,深耕人工智能領域,精通python數據挖掘、可視化、機器學習等,發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN…

SAP月結問題9-FAGLL03H與損益表中研發費用金額不一致(FAGLL03H Bug)

SAP月結問題9-FAGLL03H與損益表中研發費用金額不一致(S4 1709) 財務反饋,月結后核對數據時發現FAGLL03H導出的研發費用與損益表中的研發費用不一致,如下圖所示: 對比FAGLL03H與損益表對應的明細,發現FAGLL03H與損益表數據存在倍數…

HTML inputmode 屬性詳解

inputmode 是一個 HTML 屬性&#xff0c;用于指定用戶在編輯元素或其內容時應使用的虛擬鍵盤布局類型。它主要影響移動設備和平板電腦的輸入體驗。 語法 <input inputmode"value"> <!-- 或 --> <textarea inputmode"value"></texta…

軟考中級【網絡工程師】第6版教材 第1章 計算機網絡概述

考點分析&#xff1a; 本章重要程度&#xff1a;一般&#xff0c;為后續章節做鋪墊&#xff0c;有總體認識即可&#xff0c;選擇題1-2分高頻考點&#xff1a;OSI模型、TCP/IP模型、每個層次的功能、協議層次新教材變化&#xff1a;刪除網絡結構、刪除X.25、更新互聯網發展【基本…

Mysql事務與鎖

數據庫并發事務 數據庫一般都會并發執行多個事務&#xff0c;多個事務可能會并發的對相同的一批數據進行增刪改查操作&#xff0c;可能就會導致我們說的臟寫、臟讀、不可重復讀、幻讀這些問題。為了解決這些并發事務的問題&#xff0c;數據庫設計了事務隔離機制、鎖機制、MVCC多…

Bilibili多語言字幕翻譯擴展:基于上下文的實時翻譯方案設計

Bilibili多語言字幕翻譯擴展&#xff1a;基于上下文的實時翻譯方案設計 本文介紹了一個Chrome擴展的設計與實現&#xff0c;該擴展可以為Bilibili視頻提供實時多語言字幕翻譯功能。重點討論了字幕翻譯中的上下文問題及其解決方案。 該項目已經登陸Chrome Extension Store: http…

熱血三國野地名將列表

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>野地名將信息表</title><style>tabl…

【記錄】Word|Word創建自動編號的多級列表標題樣式

文章目錄 前言創建方式第一種方法&#xff1a;從“定義多級列表”中直接綁定已有樣式第二種方法&#xff1a;通過已有段落創建樣式&#xff0c;再綁定補充說明 尾聲 前言 這世上荒唐的事情不少&#xff0c;但若說到吊詭&#xff0c;Word中的多級列表樣式設定&#xff0c;倒是能…

使用mavros啟動多機SITL仿真

使用mavros啟動多機SITL仿真 方式1&#xff1a;使用roslaunch一鍵啟動Step1&#xff1a;創建一個新的 ROS 包或放到現有包里Step2&#xff1a;編輯 multi_mavros.launchStep3&#xff1a;構建工作空間并 source 環境Step4&#xff1a;構建工作空間并 source 環境 方式2&#xf…

Flutter 網絡棧入門,Dio 與 Retrofit 全面指南

面向多年 iOS 開發者的零阻力上手 寫在前面 你在 iOS 項目中也許習慣了 URLSession、Alamofire 或 Moya。 換到 Flutter 后&#xff0c;等價的「組合拳」就是 Dio Retrofit。 本文將帶你一次吃透兩套庫的安裝、核心 API、進階技巧與最佳實踐。 1. Dio&#xff1a;Flutter 里的…