【設計模式】觀察者模式(定義 | 特點 | Demo入門講解)

文章目錄

    • 定義
    • 結構
    • Demo | 代碼
      • Subject目標類
      • Observer抽象觀察者
      • 觀察者1 | CPU監聽器
      • 觀察者2 | 內存監聽器
      • 客戶端 | Client
    • 優點
      • 適合場景

定義

所謂觀察者模式就是你是被觀察的那個對象,你爸爸媽媽就是觀察者,一天24h盯著你,一旦你不聽話,他們要你聽話,你的狀態發生變化以后,他們接收到你的狀態發生了改變。

image-20240704145502974

結構

如下圖,服務器就作為被觀察者,三個傳感器就是觀察者。這是一種抽象的表達方式!

image-20240704145601787

image-20240704150528837

  • Subject被觀察的目標
  • Observer觀察者抽象類
  • 具體觀察者實現類
  • Client客戶端

Demo | 代碼

Subject目標類

我們需要一個Subject目標類,內部含有觀察者對象的集合,在必要的時候觸發事件。

  • Subject被觀察的目標
  • Observer觀察者抽象類
  • 具體觀察者實現類
  • Client客戶端

/*** 這個Server類就是服務類,作為Subject,別觀察的目標!* @author linghu* @date 2024/7/4 11:50*/
public class Server {private List<Observer> observers= new ArrayList<Observer>();private int cpu;private int memory;public Server() {}//變更服務器狀態public void changeState(int cpu,int memory){this.cpu=cpu;this.memory=memory;System.out.println("CPU:" + cpu + "%,內存占用:" + memory + "%");//通知所有觀察者對象,使它們能夠自動更新自己notifyAllObservers();}public Server(int cpu, int memory) {this.cpu = cpu;this.memory = memory;}public int getCpu() {return cpu;}public void setCpu(int cpu) {this.cpu = cpu;}public int getMemory() {return memory;}public void setMemory(int memory) {this.memory = memory;}public void addObserver(Observer observer){observers.add(observer);}public void notifyAllObservers(){for (Observer observer :observers) {observer.update();}}}

Observer抽象觀察者

這個抽象主要是封裝了目標對象和觀察者要做的事情。

/*** @author linghu* @date 2024/7/4 12:02*/
public abstract class Observer {protected Server subject;//服務類,目標對象public abstract void update();//觀察者要做的事情
}

觀察者1 | CPU監聽器

/*** @author linghu* @date 2024/7/4 12:04* CPU監聽器*/
public class CpuObserver extends Observer{//傳入目標類subjectpublic CpuObserver(Server subject) {//初始化的時候完成數據雙向綁定工作this.subject=subject;this.subject.addObserver(this);}@Overridepublic void update() {//監聽CPU的運行狀況,負載超過80%就發出警報if(subject.getCpu() >= 80){System.out.println("警報:CPU當前" + subject.getCpu()+ "%即將滿載,請 速查明原因");}}
}

觀察者2 | 內存監聽器

/*** @author linghu* @date 2024/7/4 12:46* 內存監聽器*/
public class MemoryObserver extends Observer{public MemoryObserver(Server subject) {this.subject=subject;this.subject.addObserver(this);}@Overridepublic void update() {if(subject.getMemory() >= 80){System.out.println("警報:服務器內存已經占用超過" + subject.getMemory()+ "%即將滿載,請 速查明原因");}}
}

客戶端 | Client

/*** 觀察者模式:讓多個觀察者對象同時監聽某一個主題對象。* 這個主題對象在狀態發生變化時,會通知所有觀察者對象,* 使它們能夠自動更新自己。* @author linghu* @date 2024/7/4 12:49* 客戶端*/
public class Client {public static void main(String[] args) throws InterruptedException {Server subject = new Server();//完成兩個觀察者和一個目標類的綁定//引入新的觀察者,這里可以利用反射,動態加載~new CpuObserver(subject);new MemoryObserver(subject);//==============================while (true){int cpu=new Random().nextInt(100);int memory=new Random().nextInt(100);//調用具體的業務~subject.changeState(cpu,memory);Thread.sleep(5000);//5s}}
}

優點

  • 開閉原則。 你?需修改發布者代碼就能引?新的訂閱者類 (如果是發布者接?則可輕松引?發布者類)。

  • 你可以在運?時建?對象之間的聯系。

適合場景

  • 所有的發布訂閱模式
  • 構建事件監聽機制,比如按下觸發click事件

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

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

相關文章

【BUUCTF-PWN】7-[第五空間2019 決賽]PWN5

參考&#xff1a;BUU pwn [第五空間2019 決賽]PWN5 //格式化字符串漏洞 - Nemuzuki - 博客園 (cnblogs.com) 格式化字符串漏洞原理詳解_printf 任意內存讀取-CSDN博客 32位小端排序&#xff0c;有棧溢出保護 運行效果&#xff1a; 查看main函數 存在格式化字符串漏洞 輸…

SQL二次注入原理分析

二次注入在測試的時候比較少見&#xff0c;或者說很難被測出來&#xff0c;因為測的時候首先要去找注入的位置&#xff0c;其次是去判斷第一次執行的SQL語句&#xff0c;然后還要去判斷第二次進行調用的 SQL 語句。而關鍵問題就出在第二次的調用上面。 下面以一個常用過濾方法…

macos下搭建minikube dashboard的啟動

背景 最近在復習一下k8s環境相關的知識&#xff0c;需要在自己電腦上搭建一個minikube的環境供自己使用。但是因為docker的鏡像倉庫最近被墻了&#xff0c;因此在執行minikube dashboard的時候&#xff0c;拉不到相應的鏡像&#xff0c;就導致頁面看不到相應的一些信息因此本文…

【PYG】dataloader和densedataloader

DenseDataLoader 是專門用于處理稠密圖數據的&#xff0c;而 DataLoader 通常用于處理稀疏圖數據。兩者的主要區別在于它們的輸入數據格式和處理方式。DenseDataLoader 適合處理固定大小的鄰接矩陣和節點特征矩陣的數據&#xff0c;而 DataLoader 更加靈活&#xff0c;可以處理…

flask中解決圖片不顯示的問題(很細微的點)

我在編寫flask項目的時候&#xff0c;在編寫html的時候&#xff0c;發現不管我的圖片路徑如何變化&#xff0c;其就是顯示不出來。如下圖我框中的地方。 我嘗試過使用瀏覽器打開&#xff0c;是可以的。 一旦運行這個flask項目&#xff0c;就無法顯示了。 我查閱資料后。發現…

簡易版async/await

參考&#xff1a;https://juejin.cn/post/7007031572238958629?searchId20240704101813568E9B5B1013C881A239#heading-15 總結一下async/await的知識點 1、 await只能在async函數中使用&#xff0c;不然會報錯 2、 async函數返回的是一個Promise對象&#xff0c;有無值看有…

泛微開發修煉之旅--29用計劃任務定時發送郵件提醒

文章鏈接&#xff1a;29用計劃任務定時發送郵件提醒

[單master節點k8s部署]17.監控系統構建(二)Prometheus安裝

prometheus server安裝 創建sa賬號&#xff0c;對prometheus server進行授權。因為Prometheus是安裝在pod里面&#xff0c;以pod的形式去運行的&#xff0c;因此需要創建sa&#xff0c;并對他做rbac授權。 apiVersion: v1 kind: ServiceAccount metadata:name: monitornamesp…

k8s-第九節-命名空間

命名空間 如果一個集群中部署了多個應用&#xff0c;所有應用都在一起&#xff0c;就不太好管理&#xff0c;也可以導致名字沖突等。 我們可以使用 namespace 把應用劃分到不同的命名空間&#xff0c;跟代碼里的 namespace 是一個概念&#xff0c;只是為了劃分空間。 # 創建命…

LeetCode熱題100刷題4:76. 最小覆蓋子串、239. 滑動窗口最大值、53. 最大子數組和、56. 合并區間

76. 最小覆蓋子串 滑動窗口解決字串問題。 labuladong的算法小抄中關于滑動窗口的算法總結&#xff1a; class Solution { public:string minWindow(string s, string t) {unordered_map<char,int> need,window;for(char c : t) {need[c];}int left 0, right 0;int …

2.8億東亞五國建筑數據分享

數據是GIS的血液&#xff01; 我們現在為你分享東亞5國的2.8億條建筑輪廓數據&#xff0c;該數據包括中國、日本、朝鮮、韓國和蒙古5個東亞國家完整、高質量的建筑物輪廓數據&#xff0c;你可以在文末查看領取方法。 數據介紹 雖然開源的全球的建筑數據已經有微軟的建筑數據…

elementUI中table組件固定列時會渲染兩次模板內容問題

今天在使用elementUI的table組件時&#xff0c;由于業務需要固定表格的前幾項列&#xff0c;然后獲取表格對象時發現竟然有兩個對象。 查閱資料發現&#xff0c;elementUI的固定列的實現原理是將兩個表格拼裝而成&#xff0c;因此獲取的對象也是兩個。對于需要使用對象的方法的…

vxe-table的序號一樣

使用vxe-table的時候&#xff0c;有的時候會出現序號相同的現象&#xff0c;這種現象一般出現在我們后面自己添加的行中&#xff0c;就像這種 此時的這三個序號是相同的&#xff0c;我來說一下原因&#xff0c;這是在添加新的一行的時候&#xff0c;有的時候數據很多&#xff0…

Mac 運行 Windows 軟件,Parallels Desktop 19和 CrossOver 24全面對比

Parallels Desktop 和 CrossOver 都是能滿足你「在 Mac 上運行 Windows 軟件」需求的工具。可能很多人都已經知道 Parallels Desktop 是「虛擬機」&#xff0c;但 CrossOver 其實并不是「虛擬機」。這兩款軟件有相同的作用&#xff0c;但由于實現原理的不同&#xff0c;兩者也有…

系統提示我未定義與 ‘double‘ 類型的輸入參數相對應的函數 ‘finverse‘,如何解決?

&#x1f3c6;本文收錄于「Bug調優」專欄&#xff0c;主要記錄項目實戰過程中的Bug之前因后果及提供真實有效的解決方案&#xff0c;希望能夠助你一臂之力&#xff0c;幫你早日登頂實現財富自由&#x1f680;&#xff1b;同時&#xff0c;歡迎大家關注&&收藏&&…

Kubernetes 部署簡單的應用

Kubernetes 部署簡單的應用 Kubernetes 是一個強大的容器編排平臺&#xff0c;它可以幫助我們自動化應用程序的部署、擴展和管理。在本期文章中&#xff0c;我們將學習如何使用 Kubernetes 部署一個簡單的應用程序。 1. 環境準備 確保你已經安裝了 Kubernetes 集群&#xff…

【python模塊】argparse

文章目錄 argparse模塊介紹基本用法add_argument() argparse模塊介紹 argparse 模塊是 Python 標準庫中的一個用于編寫用戶友好的命令行接口&#xff08;CLI&#xff09;的模塊。它允許程序定義它所需要的命令行參數&#xff0c;然后 argparse 會自動從 sys.argv 解析出那些參…

TCP粘包解決方法

一. 產生原因及解決方法 產生原因&#xff1a;TCP是面向連接、基于字節流的協議&#xff0c;其無邊界標記。當服務端處理速度比不其接收速度時&#xff0c;就很容易產生粘包現象。 解決方法&#xff1a;目前主要有兩種解決方法&#xff0c;一個是在內容中添加分割標識&#xf…

人臉識別考勤系統

人臉識別考勤系統是一種利用生物識別技術進行自動身份驗證的現代解決方案&#xff0c;它通過分析和比對人臉特征來進行員工的出勤記錄。這種系統不僅提升了工作效率&#xff0c;還大大減少了人為錯誤和欺詐行為的可能性。 一、工作原理 人臉識別考勤系統的核心在于其生物識別…

深入剖析Python中的Pandas庫:通過實戰案例全方位解讀數據清洗與預處理藝術

引言 隨著大數據時代的到來&#xff0c;數據的質量直接影響到最終分析結果的可靠性和有效性。在這個背景下&#xff0c;Python憑借其靈活強大且易于上手的特點&#xff0c;在全球范圍內被廣泛應用于數據科學領域。而在Python的數據處理生態中&#xff0c;Pandas庫無疑是最耀眼…