設計模式之【觀察者模式】

目錄

觀察者模式中的角色

通過一個簡單案例來演示觀察者模式

被觀察者接口

事件類型

up主類作為被觀察者

觀察者接口

?粉絲類作為觀察者

測試

測試結果


觀察者模式中的角色

  • 被觀察者(observable)
  • 觀察者(observer)

通過一個簡單案例來演示觀察者模式

被觀察者接口

/*** 被觀察者*/
public interface Observable {/*** 添加觀察者*/void addObserver(Observer observer);/*** 移除觀察者*/void delObserver(Observer observer);/*** 通知觀察者*/void advice(String msg, EventType eventType);
}

事件類型

/*** 事件類型*/
public enum EventType {NEW_COMPOSITION(1, "發布了新作品,點擊查看新作品"),LIVE_BROADCAST(2, "正在直播中,前去觀看");private final Integer key;private final String desc;EventType(Integer key, String desc) {this.key = key;this.desc = desc;}public Integer getKey() {return key;}public String getDesc() {return desc;}
}

up主類作為被觀察者

import java.util.ArrayList;
import java.util.List;/*** up主(被觀察者)*/
public class UpOwner implements Observable {// 維護一個觀察者集合private final List<Observer> observers = new ArrayList<>();private final Integer id;private final String name;public UpOwner(Integer id, String name) {this.id = id;this.name = name;}@Overridepublic void addObserver(Observer observer) {if (!observers.contains(observer)) {observers.add(observer);}}@Overridepublic void delObserver(Observer observer) {observers.remove(observer);}@Overridepublic void advice(String msg, EventType eventType) {for (Observer observer : observers) {observer.take(msg, eventType);}}/*** 發布新作品*/public void uploadComposition() {advice(buildMsg(), EventType.NEW_COMPOSITION);}/*** 開始直播*/public void beginLive() {advice(buildMsg(), EventType.LIVE_BROADCAST);}public String buildMsg() {return String.format("您關注的up主[%s-%s]", getId(), getName());}public Integer getId() {return id;}public String getName() {return name;}
}

觀察者接口

package sjms.observer;/*** 觀察者*/
public interface Observer {/*** 被觀察者執行的動作會觸發該方法*/void take(String msg, EventType eventType);
}

?粉絲類作為觀察者

/*** 粉絲(觀察者)*/
public class Fan implements Observer {private final Integer id;private final String name;public Fan(Integer id, String name) {this.id = id;this.name = name;}@Overridepublic void take(String msg, EventType eventType) {System.out.println(this + "接收到消息:{" + msg + eventType.getDesc() + "}");}@Overridepublic String toString() {return "粉絲[" + id + "-" + name + ']';}
}

測試

public class MainTest {public static void main(String[] args) {// up主一UpOwner up = new UpOwner(0, "up主一");// 粉絲1、粉絲2、粉絲3Observer fan1 = new Fan(1, "fan1");Observer fan2 = new Fan(2, "fan2");Observer fan3 = new Fan(3, "fan3");// 粉絲1、粉絲2關注了up主一up.addObserver(fan1);up.addObserver(fan2);// 此時up主一發布一條新作品,粉絲1、粉絲2能收到信息并做出反應,粉絲3并沒有關注up主一,所以收不到信息up.uploadComposition();System.out.println("------顯眼的分界線------");// 粉絲1取關了up主一up.delObserver(fan1);// 粉絲3關注了up主一up.addObserver(fan3);// 此時up主一開啟了直播,粉絲2、粉絲3能收到消息并做出反應,粉絲1已經取關了up主一,所以收不到消息up.beginLive();}
}

測試結果

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

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

相關文章

Linux sudo host權限提升漏洞(CVE-2025-32462)復現與原理分析

免責聲明 本文所述漏洞復現方法僅供安全研究及授權測試使用&#xff1b; 任何個人/組織須在合法合規前提下實施&#xff0c;嚴禁用于非法目的&#xff1b; 作者不對任何濫用行為及后果負責&#xff0c;如發現新漏洞請及時聯系廠商并遵循漏洞披露規則。 漏洞簡述 Linux sudo是l…

【uni-ui】hbuilderx的uniapp 配置 -小程序左滑出現刪除等功能

1.網址&#xff1a;https://ext.dcloud.net.cn/plugin?id181](https://ext.dcloud.net.cn/plugin?id181) 2.csdn講解&#xff1a;https://blog.csdn.net/qq_40323256/article/details/114337128 3.uni-ui git&#xff1a;https://github.com/dcloudio/uni-ui 4.官方網址文檔&…

記一次POST請求中URL中文參數亂碼問題的解決方案

POST請求中URL中文參數亂碼前言&#xff1a;一個常見的開發痛點一、問題現象與原因深度解析1. 典型問題場景2. 根本原因分析URL編碼規范問題&#xff1a;編碼解碼過程不一致&#xff1a;IE瀏覽器特殊行為&#xff1a;二、前端解決方案1. 手動編碼URL參數&#xff08;推薦&#…

從存儲熱遷移流程了解 QEMU block layer

文章目錄存儲熱遷移流程總體流程代碼路徑QEMU Block layer架構簡述Block Job結構體設計狀態轉換Mirror block job拓撲結構構建過程數據結構存儲熱遷移流程 總體流程 Libvirt migrate 命令提供 copy-storage-all 選項支持存儲熱遷移&#xff0c;相應地&#xff0c;Libvirt 熱遷…

【設計模式】命令模式 (動作(Action)模式或事務(Transaction)模式)宏命令

命令模式&#xff08;Command Pattern&#xff09;詳解一、命令模式簡介 命令模式&#xff08;Command Pattern&#xff09; 是一種 行為型設計模式&#xff08;對象行為型模式&#xff09;&#xff0c;它將一個請求封裝為一個對象&#xff0c;從而使你可以用不同的請求對客戶進…

HTML5智能排班日歷:動態排班一目了然

這個日歷將具備以下功能: 顯示一個標準的月度日歷視圖。可以自由切換上一個月和下一個月。在日歷的每一天自動顯示當天值班的人員。您可以很方便地在文件中修改值班人員列表和排班的起始日期。包括:動態生成日歷網格處理月份切換根據排班規則計算并顯示每天的值班人員<!DO…

深度剖析C++生態系統:一門老牌語言如何在開源浪潮中煥發新生?

&#x1f4dd;個人主頁&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的關注 &#x1f339;&#x1f339; 一、前言&#xff1a;C的“長壽秘訣”是什么&#xff1f; C 誕生已超過 40 年。它經歷了桌面應用、互聯網爆發、移動時代&#xff0c;再…

60個功能OfficeBox 萬彩辦公大師:PDF 格式轉換 OCR識別免費無廣告

各位辦公小能手們&#xff01;今天給大家介紹個超厲害的免費辦公工具套裝——OfficeBox萬彩辦公大師&#xff0c;是廣州萬彩科技整出來的。軟件下載地址安裝包 它里面有60多個沒廣告的綠色組件&#xff0c;簡直像個百寶箱&#xff01;涵蓋了PDF處理、格式轉換、OCR識別、屏幕錄…

擁抱主權AI:OpenCSG驅動智能體運營,共筑新加坡智能高地

2025年7月11日&#xff0c;由Linux基金會AI & Data、TikTok及LF Edge聯合主辦的 【LF AI & Data Day Singapore 2025】 在新加坡TikTok總部盛大啟幕。本次大會以“Agent for SWE”為核心議題&#xff0c;匯聚全球頂尖AI開發者、企業領袖及開源社區先鋒。作為國家主權AI…

單片機學習筆記.根據芯片數據手冊寫驅動程序(這里使用的是普中開發版,以DS1302為例)

硬件原理圖部分&#xff1a; VCC2:是主電源 VCC1&#xff1a;是備用電源&#xff0c;此處沒有使用VCC1 查芯片數據手冊的網站&#xff1a; ALLDATASHEETCN.COM - 電子元件和半導體及其他半導體的數據表搜索網站。https://www.alldatasheetcn.com/ 1.由原理圖可知對應引腳&…

Capture One24下載與保姆級安裝教程!

軟件下載 軟件名稱&#xff1a;Capture One24 軟件語言&#xff1a;簡體中文 軟件大小&#xff1a;1.06G 系統要求&#xff1a;Windows7或更高&#xff0c;32/64位操作系統 硬件要求&#xff1a;CPU2.5GHz&#xff0c;RAM4G或更高 下載通道丨下載&#xff1a;https://too…

微信小程序(數據庫)

const dbwx.cloud.database()//連接數據庫db.collection("test").doc("b69f67c0626fac9000e123fc1ff07a42&#xff08;為要查詢數據的id&#xff09;").get({success:res>{console.log(res)}})或getData(){db.collection("test").doc("&…

Apache CXF 漏洞曝光:存在拒絕服務與數據泄露雙重風險

Apache軟件基金會近日披露了一個影響多個Apache CXF版本的安全漏洞&#xff08;CVE-2025-48795&#xff09;。Apache CXF是開發者廣泛使用的開源Web服務框架&#xff0c;用于構建基于SOAP和REST的應用程序。漏洞雙重威脅該漏洞具有雙重危害性&#xff1a;一方面可能通過內存耗盡…

Android 應用自動更新:從理論到實戰的硬核指南

目錄 1. 自動更新的核心邏輯:為什么它對用戶體驗至關重要? 自動更新的本質 為什么它如此重要? 2. 版本檢測:如何優雅地發現“新大陸”? 設計版本檢測的邏輯 實現版本檢測的 API 請求 用戶體驗優化 3. 下載新版本:穩妥地獲取安裝包 下載的兩種方式 注意事項 用戶…

每日面試題05:ArrayList和LinkedList的底層原理

ArrayList與LinkedList深度解析&#xff1a;從底層原理到實戰選擇在Java的List接口實現中&#xff0c;ArrayList和LinkedList是最常用的兩種選擇。面試中“它們的區別”幾乎是必問題&#xff0c;但僅僅停留在“數組vs鏈表”的層面顯然不夠。本文將從??底層數據結構、內存布局…

python的慈善捐贈平臺管理信息系統

前端開發框架:vue.js 數據庫 mysql 版本不限 后端語言框架支持&#xff1a; 1 java(SSM/springboot)-idea/eclipse 2.NodejsVue.js -vscode 3.python(flask/django)–pycharm/vscode 4.php(thinkphp/laravel)-hbuilderx 數據庫工具&#xff1a;Navicat/SQLyog等都可以 摘要 本文…

三十二、【核心功能改造】數據驅動:重構儀表盤與關鍵指標可視化

三十二、【核心功能改造】數據驅動:重構儀表盤與關鍵指標可視化 前言準備工作第一部分:后端實現 - 統計 API1. 創建 `DashboardStatsView`2. 注冊統計 API 路由3. 后端初步測試第二部分:前端實現 - 重構儀表盤頁面1. 創建 `api/dashboard.ts` API 服務2. 重構 `HomeView.vue…

神經網絡與深度學習Python入門

一、神經網絡基礎 1. 神經元模型 在神經網絡中&#xff0c;最基本的單元是神經元&#xff08;Neuron&#xff09;&#xff0c;也稱為節點或單元。它模擬了生物神經系統中的神經元行為。一個典型的神經元模型包含多個輸入&#xff08;x1,x2,…,xnx_1, x_2, \ldots, x_nx1?,x2?…

Android System WebView:Android生態的核心組件

在Android生態系統中&#xff0c;Android System WebView&#xff08;簡稱WebView&#xff09;扮演著至關重要的角色。它是Chrome瀏覽器的內核&#xff0c;為Android設備提供了強大的網頁瀏覽和Web內容展示功能。無論是日常瀏覽網頁、使用基于Web的應用程序&#xff0c;還是進行…

Element Plus和Ant Design Vue深度對比分析與選型指南

在 Vue3生態中&#xff0c;Element Plus和Ant Design Vue&#xff08;以下簡稱 AntD Vue&#xff09;是兩款最主流的 UI 組件庫。它們分別脫胎于 Element UI&#xff08;Vue 2 版本&#xff09;和 Ant Design&#xff08;React 生態&#xff09;&#xff0c;經過多年迭代已成為…