【設計模式】4.代理模式

every blog every motto: You can do more than you think.
https://blog.csdn.net/weixin_39190382?type=blog

0. 前言

代理模式

20250518094605

1. 第一版

class SchoolGirl:def __init__(self):self._name = None@propertydef name(self):return self._name@name.setterdef name(self, value):self._name = valueclass Pursuit:def __init__(self, mm):self.mm = mmdef give_dolls(self):print(f"{self.mm.name}送你洋娃娃")def give_flowers(self):print(f"{self.mm.name}送你鮮花")def give_chocolate(self):print(f"{self.mm.name}送你巧克力")# 客戶端調用代碼
if __name__ == "__main__":jiaojiao = SchoolGirl()jiaojiao.name = "李嬌嬌"zhuojiayi = Pursuit(jiaojiao)zhuojiayi.give_dolls()zhuojiayi.give_flowers()zhuojiayi.give_chocolate()input()  # 相當于C#的Console.Read()

這一版本沒有代理,增加代理

2. 第二版

20250518094740

class SchoolGirl:def __init__(self):self._name = None@propertydef name(self):return self._name@name.setterdef name(self, value):self._name = valueclass Proxy:def __init__(self, mm):self.mm = mmdef give_dolls(self):print(f"{self.mm.name} 送你洋娃娃")def give_flowers(self):print(f"{self.mm.name} 送你鮮花")def give_chocolate(self):print(f"{self.mm.name} 送你巧克力")# 客戶端調用代碼
if __name__ == "__main__":jiaojiao = SchoolGirl()jiaojiao.name = "李嬌嬌"daili = Proxy(jiaojiao)daili.give_dolls()daili.give_flowers()daili.give_chocolate()input()  # 等待用戶輸入,相當于C#的Console.Read()

3. 第三版

20250518095309

以下是完整的 Python 實現,包含接口抽象、追求者類、代理類和客戶端代碼,嚴格遵循代理模式的設計:

from abc import ABC, abstractmethod# 代理接口 (Python 中使用抽象基類實現接口)
class GiveGift(ABC):@abstractmethoddef give_dolls(self):pass@abstractmethoddef give_flowers(self):pass@abstractmethoddef give_chocolate(self):pass# SchoolGirl 類
class SchoolGirl:def __init__(self):self._name = None@propertydef name(self):return self._name@name.setterdef name(self, value):self._name = value# 追求者類 (實現 GiveGift 接口)
class Pursuit(GiveGift):def __init__(self, mm):self.mm = mmdef give_dolls(self):print(f"{self.mm.name} 送你洋娃娃")def give_flowers(self):print(f"{self.mm.name} 送你鮮花")def give_chocolate(self):print(f"{self.mm.name} 送你巧克力")# 代理類 (同樣實現 GiveGift 接口)
class Proxy(GiveGift):def __init__(self, mm):self.gg = Pursuit(mm)  # 內部持有追求者實例def give_dolls(self):self.gg.give_dolls()  # 調用追求者的方法def give_flowers(self):self.gg.give_flowers()def give_chocolate(self):self.gg.give_chocolate()# 客戶端代碼
if __name__ == "__main__":jiaojiao = SchoolGirl()jiaojiao.name = "李嬌嬌"# 使用代理而不是直接使用追求者daili = Proxy(jiaojiao)daili.give_dolls()daili.give_flowers()daili.give_chocolate()input()  # 等待用戶輸入

關鍵設計說明:

  1. 使用 abc 模塊實現了 GiveGift 接口(Python 沒有原生接口,用抽象基類模擬)
  2. PursuitProxy 都繼承自 GiveGift,保證接口一致性
  3. Proxy 內部持有 Pursuit 實例,所有方法調用都委托給實際追求者
  4. 客戶端只與代理交互,不知道實際追求者的存在
  5. 保持了原始設計中的所有核心關系和方法調用流程

這個實現完整展示了代理模式的幾個關鍵特點:

  • 為其他對象提供一種代理以控制對這個對象的訪問
  • 代理類和真實類實現相同接口
  • 代理類內部持有真實類的實例
  • 客戶端通過代理間接訪問真實對象

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

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

相關文章

基于微信小程序的美食點餐訂餐系統

文章目錄 1. 項目概述2. 項目思維導圖3. 系統架構特點4. 核心模塊實現代碼1. 登錄注冊2. 首頁模塊實現4. 分類模塊實現5. 購物車模塊實現6. 訂單模塊實現 5. 注意事項6. 項目效果截圖7. 關于作者其它項目視頻教程介紹 1. 項目概述 在移動互聯網時代,餐飲行業數字化…

[neo4j]介紹4個開源的知識圖譜項目

項目主要介紹幾個開源項目: QASystemOnMedicalKG:醫療知識圖譜問答 https://github.com/liuhuanyong/QASystemOnMedicalKG Agriculture_KnowledgeGraph:農業知識圖譜 Financial-Knowledge-Graphs:小型金融知識圖譜 stock-know…

20倍光學鏡頭怎么實現20+20倍數實現

1. 硬件選擇 球機攝像頭 選擇40倍光學變焦的攝像頭 :確保攝像頭具有足夠的變焦能力,同時考慮攝像頭的分辨率、幀率、夜視功能等。 內置云臺 :許多高端攝像頭已經內置了云臺功能,如果是這樣,可以簡化機械設計和電機控制…

Axios 在 Vue3 項目中的使用:從安裝到組件中的使用

🤍 前端開發工程師、技術日更博主、已過CET6 🍨 阿珊和她的貓_CSDN博客專家、23年度博客之星前端領域TOP1 🕠 牛客高級專題作者、打造專欄《前端面試必備》 、《2024面試高頻手撕題》、《前端求職突破計劃》 🍚 藍橋云課簽約作者、…

【Python打卡Day50】預訓練模型與CBAM注意力@浙大疏錦行

現在我們思考下,是否可以對于預訓練模型增加模塊來優化其效果,這里我們會遇到一個問題: 預訓練模型的結構和權重是固定的,如果修改其中的模型結構,是否會大幅影響其性能。其次是訓練的時候如何訓練才可以更好的避免破壞原有的特征…

ONLYOFFICE Jira 集成應用程序 4.0.0 發布,含新的文件格式支持等多個重大更新!

ONLYOFFICE 與 Jira 集成的重大更新現已發布!使用 ONLYOFFICE Docs 在 Jira Software 中處理各種辦公文檔,從 4.0.0 版本開始,ONLYOFFICE 連接器允許您編輯 PDF 文件和表單、直接從編輯器創建新文件、可視化用戶頭像、在 Jira 平臺內處理新文…

安裝區塊鏈相關Geth(基于CentOS7)

注:由于版本沖突問題,請嚴格按如下介紹版本進行安裝 安裝所需資料:通過網盤分享的文件:區塊鏈_CSDN 鏈接: https://pan.baidu.com/s/1dn5xcLtwwFy90xhOWKiWyA?pwdzgzs 提取碼: zgzs --來自百度網盤超級會員v6的分享 一、安裝運…

系統分析師——計算機系統基礎

系統分析師——計算機系統基礎 引言 作為系統分析師學習的第一節課,計算機系統基礎部分構建了整個知識體系的核心框架。本文將圍繞計算機系統的層次結構、硬件組成、軟件分類以及關鍵技術點進行詳細總結,為后續深入學習奠定基礎。 本節學習內容如下圖&…

JS常用設計模式匯總

1、基于類的單例模式 // PageManager.js class PageManager {constructor(config) {if (!PageManager.instance) {this.config config;this.initialized false;PageManager.instance this;this.init();}return PageManager.instance;}init() {if (this.initialized) return…

邁向軟件開發 T 型人才之路:構建多元能力體系

在軟件開發的廣袤天地里,T 型人才備受矚目。這類人才猶如具備強大能量的 “多面手”,既有深入專精的技術能力,又有廣泛多元的知識與技能儲備,能夠從容應對復雜多變的項目需求,引領行業創新發展。于當今社會而言&#x…

SALMONN-omni論文閱讀

論文鏈接 項目鏈接 名詞理解: backchanneling: 指的是聽話人在不打斷說話人的情況下,用簡短的語氣詞或動作表示“我在聽”“我理解了”的反饋。 常見示例包括: “嗯哼”(“uh-huh”) “對的”&#xff08…

區塊鏈:什么是DeFi?

DeFi(去中心化金融,Decentralized Finance) 是一種基于區塊鏈技術的金融生態系統,旨在通過去中心化的方式提供傳統金融服務(如借貸、交易、儲蓄等),無需依賴銀行、經紀商等中介機構。DeFi主要構…

idea編譯器使用git拉取、提交非常慢的原因和解決方案

前言 最近在公司換了一個電腦,但是發現這個電腦用idea編譯器使用git拉取、提交各種操作非常慢,有時候需要等10分鐘左右,這明顯是不對勁的,說明電腦的某些環境影響到git和idea之間的整合了。 目錄 在idea拉取代碼非常慢的原因 解決方案 在idea拉取代碼非常慢的原因 經過排查…

C語言變量的奇妙世界:探秘作用域

資料合集下載鏈接: ??https://pan.quark.cn/s/472bbdfcd014?? 在C語言的編程世界里,變量是我們存儲和操作數據的基礎。然而,僅僅知道如何定義和使用變量是遠遠不夠的。一個更深層次的理解,在于掌握變量的“作用域”——也就是變量在程序中可以被訪問和使用的范圍。這就…

恒流源和直流穩壓電源 電路

目錄 前言一、恒流源電路1.低端反饋2.低端反饋注意事項注意1:電阻Rx注意2:三極管和運放的限制 3.高端反饋注意:自激振蕩方案二 二、直流穩壓電源電流1.帶反饋2.不帶反饋3.區別 前言 基礎知識可以看個人筆記:個人筆記 一、恒流源…

那些年,曾經輝煌過的數據庫

滾滾長江東逝水,浪花淘盡英雄! 數據庫的演進史,正是這樣一部“英雄迭代”的壯闊史詩。從早期數據模型的拓荒者,到關系型數據庫的商業巨頭;從桌面應用的普及者,再到開源與大數據時代的弄潮兒;每…

2D曲線點云平滑去噪

2D曲線點云,含許多噪聲,采用類似移動最小二乘的方法(MLS)分段擬合拋物線并投影至拋物線,進行點云平滑去噪。 更通俗的說法是讓有一定寬度的曲線點云,變成一條細曲線上的點。 分兩種情況進行討論: 1&#…

【平面波導外腔激光器專題系列】用于精密測量的平面波導外腔激光器特性

----翻譯自Kenji Numata等人的文章 摘要 1542 nm平面波導外腔激光器PW-ECL具有足夠低的噪聲非常適合精密測量應用。與 0.1mHz至100kHz 之間,其頻率和強度噪聲與非平面環形振蕩器 NPRO和光纖激光器相當或更好。通過將 PW-ECL 的頻率穩定在乙炔(13C2H2&a…

文件時間修改器

文件時間修改器是一款幫助用戶修改文件創建時間的軟件,支持毫秒級時間的修改,包括文件的創建時間、修改時間、訪問時間等時間都支持修改,可以批量處理文件。 飛貓云下載 | 備用下載1 |備用下載2 基本簡介 本軟件主要為批量修改文件的創建時…

倉頡語言實戰:MQTT物聯網開發

目錄 引言 mqtt4cj庫的使用 申請倉頡編程語言內測 下載STDX 測試程序 結束語 引言 最近一直在學習倉頡語言,由于我對物聯網比較感興趣,自然想到寫一個MQTT的程序,好在找到了mqtt4cj庫,今天分享一下學習心得。 mqtt4cj庫的…