Python 設計模式:訪問者模式

1. 什么是訪問者模式?

訪問者模式是一種行為設計模式,它允許你在不改變對象結構的前提下,定義新的操作。通過將操作封裝在訪問者對象中,訪問者模式使得你可以在不修改元素類的情況下,向元素類添加新的功能。

訪問者模式的核心思想是將操作與對象結構分離。通過引入一個訪問者對象,允許你在不修改對象結構的情況下,定義新的操作。這樣可以提高系統的靈活性和可擴展性。

訪問者模式通常包含以下幾個組成部分:

  • 訪問者接口(Visitor Interface):定義訪問者的接口,通常包含對每個元素類的訪問方法。
  • 具體訪問者(Concrete Visitor):實現訪問者接口,定義對每個元素類的具體操作。
  • 元素接口(Element Interface):定義接受訪問者的接口,通常包含一個接受訪問者的方法。
  • 具體元素(Concrete Element):實現元素接口,定義具體的元素類。

訪問者模式在軟件設計中具有多種優點:

  • 分離操作與對象結構:通過將操作封裝在訪問者中,訪問者模式使得操作與對象結構分離,增強了系統的靈活性。
  • 易于擴展:可以通過添加新的訪問者來擴展系統的功能,而不需要修改現有的元素類。
  • 集中操作:所有操作都集中在訪問者中,便于管理和維護。
# 訪問者接口
class DiscountVisitor:def visit_book(self, book):passdef visit_electronic(self, electronic):pass# 具體訪問者
class PercentageDiscount(DiscountVisitor):def visit_book(self, book):return book.price * 0.9  # 書籍享受10%的折扣def visit_electronic(self, electronic):return electronic.price * 0.85  # 電子產品享受15%的折扣# 元素接口
class Item:def accept(self, visitor):pass# 具體元素
class Book(Item):def __init__(self, price):self.price = pricedef accept(self, visitor):return visitor.visit_book(self)  # 接受訪問者class Electronic(Item):def __init__(self, price):self.price = pricedef accept(self, visitor):return visitor.visit_electronic(self)  # 接受訪問者# 客戶端代碼
if __name__ == "__main__":items = [Book(100), Electronic(200)]  # 創建購物車中的商品discount_visitor = PercentageDiscount()  # 創建折扣訪問者for item in items:discounted_price = item.accept(discount_visitor)  # 計算折扣后的價格print(f"Discounted price: {discounted_price}")
  1. 訪問者接口DiscountVisitor 類定義了訪問者的接口,包含對每個元素類的訪問方法(visit_bookvisit_electronic)。
  2. 具體訪問者
    • PercentageDiscount 類實現了訪問者接口,定義了對每個元素類的具體操作(計算折扣后的價格)。
    • visit_book 方法中,書籍享受10%的折扣;在 visit_electronic 方法中,電子產品享受15%的折扣。
  3. 元素接口Item 類定義了接受訪問者的接口,包含一個 accept 方法。
  4. 具體元素
    • BookElectronic 類實現了元素接口,定義具體的商品類,并實現 accept 方法,接受訪問者。
  5. 客戶端代碼
    • 在客戶端代碼中,創建購物車中的商品和折扣訪問者,并通過調用 accept 方法來計算折扣后的價格。

2. 示例1:寵物店中的訪問者模式

  • 訪問者接口(Visitor Interface):定義訪問者的接口,通常包含對每個寵物類的訪問方法。
  • 具體訪問者(Concrete Visitor):實現訪問者接口,定義對每個寵物類的具體操作(如計算數量、平均體重和最大年齡)。
  • 元素接口(Element Interface):定義接受訪問者的接口,通常包含一個接受訪問者的方法。
  • 具體元素(Concrete Element):實現元素接口,定義具體的寵物類(如貓和狗)。
# 訪問者接口
class PetVisitor:def visit_cat(self, cat):passdef visit_dog(self, dog):pass# 具體訪問者:數量統計
class CountVisitor(PetVisitor):def __init__(self):self.cat_count = {'male': 0, 'female': 0}self.dog_count = {'male': 0, 'female': 0}def visit_cat(self, cat):self.cat_count[cat.gender] += 1def visit_dog(self, dog):self.dog_count[dog.gender] += 1def report(self):print(f"Cat Count: {self.cat_count['male']} males, {self.cat_count['female']} females")print(f"Dog Count: {self.dog_count['male']} males, {self.dog_count['female']} females")# 具體訪問者:平均體重計算
class WeightVisitor(PetVisitor):def __init__(self):self.total_cat_weight = 0self.total_dog_weight = 0self.cat_count = 0self.dog_count = 0def visit_cat(self, cat):self.total_cat_weight += cat.weightself.cat_count += 1def visit_dog(self, dog):self.total_dog_weight += dog.weightself.dog_count += 1def report(self):avg_cat_weight = self.total_cat_weight / self.cat_count if self.cat_count > 0 else 0avg_dog_weight = self.total_dog_weight / self.dog_count if self.dog_count > 0 else 0print(f"Average Cat Weight: {avg_cat_weight:.2f} kg")print(f"Average Dog Weight: {avg_dog_weight:.2f} kg")# 具體訪問者:最大年齡查找
class AgeVisitor(PetVisitor):def __init__(self):self.max_cat_age = 0self.max_dog_age = 0def visit_cat(self, cat):if cat.age > self.max_cat_age:self.max_cat_age = cat.agedef visit_dog(self, dog):if dog.age > self.max_dog_age:self.max_dog_age = dog.agedef report(self):print(f"Oldest Cat Age: {self.max_cat_age} years")print(f"Oldest Dog Age: {self.max_dog_age} years")# 具體元素:貓
class Cat:def __init__(self, gender, weight, age):self.gender = gender  # 'male' or 'female'self.weight = weight  # 體重self.age = age  # 年齡def accept(self, visitor):visitor.visit_cat(self)  # 接受訪問者# 具體元素:狗
class Dog:def __init__(self, gender, weight, age):self.gender = gender  # 'male' or 'female'self.weight = weight  # 體重self.age = age  # 年齡def accept(self, visitor):visitor.visit_dog(self)  # 接受訪問者# 客戶端代碼
if __name__ == "__main__":pets = [Cat('male', 4.5, 3),Cat('female', 3.0, 2),Dog('male', 10.0, 5),Dog('female', 8.5, 4),Cat('male', 5.0, 6),Dog('female', 9.0, 7)]count_visitor = CountVisitor()  # 創建數量統計訪問者weight_visitor = WeightVisitor()  # 創建平均體重計算訪問者age_visitor = AgeVisitor()  # 創建最大年齡查找訪問者# 統計數量、計算平均體重和查找最大年齡for pet in pets:pet.accept(count_visitor)  # 統計數量pet.accept(weight_visitor)  # 計算平均體重pet.accept(age_visitor)  # 查找最大年齡# 輸出統計結果count_visitor.report()weight_visitor.report()age_visitor.report()
Cat Count: 2 males, 1 females
Dog Count: 1 males, 2 females
Average Cat Weight: 4.17 kg
Average Dog Weight: 9.17 kg
Oldest Cat Age: 6 years
Oldest Dog Age: 7 years
  1. 訪問者接口PetVisitor 類定義了訪問者的接口,包含對每個寵物類的訪問方法(visit_catvisit_dog)。

  2. 具體訪問者

    • CountVisitor 類實現了訪問者接口,負責統計寵物的數量(按性別分類)。
    • WeightVisitor 類實現了訪問者接口,負責計算寵物的平均體重。
    • AgeVisitor 類實現了訪問者接口,負責找出年齡最大的貓和狗。
  3. 具體元素

    • CatDog 類實現了元素接口,定義具體的寵物類,并實現 accept 方法,接受訪問者。
  4. 客戶端代碼

    • 在客戶端代碼中,創建寵物對象(貓和狗)并創建數量統計、平均體重計算和最大年齡查找的訪問者。
    • 通過調用 accept 方法,分別統計數量、計算平均體重和查找最大年齡,并打印結果。

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

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

相關文章

基于stm32的智能門鎖系統

標題:基于stm32的智能門鎖系統 內容:1.摘要 摘要:隨著科技的飛速發展,人們對家居安全的要求日益提高,智能門鎖系統應運而生。本研究的目的是設計并實現一個基于STM32的智能門鎖系統。采用STM32微控制器作為核心控制單元,結合指紋…

GitHub 常見高頻問題與解決方案(實用手冊)

目錄 1.Push 提示權限錯誤(Permission denied) 2.push 報錯:rejected non-fast-forward 3.忘記添加 .gitignore,上傳了無關文件 4. 撤銷最近一次 commit 5.clone 太慢或失敗 6.如何切換/創建分支 7.如何合并分支 8.如何刪除遠程分支 9.如何 Fork + PR(Pull Reque…

【MySQL數據庫入門到精通-04 DML操作】

一、DML DML英文全稱是Data Manipulation Language(數據操作語言),用來對數據庫中表的數據記錄進行增、刪、改操作。 二、添加數據 1.給指定字段添加數據 代碼如下(示例): insert into 表名 (字段1,字…

2022 年 9 月青少年軟編等考 C 語言六級真題解析

目錄 T1. 棧的基本操作T2. stack or queue思路分析T3. 合影效果T4. 發型糟糕的一天思路分析T1. 棧的基本操作 題目鏈接:SOJ D1188 此題為 2022 年 6 月三級第二題僅有棧操作的版本,見 2022 年 6 月青少年軟編等考 C 語言三級真題解析中的 T2。 T2. stack or queue 題目鏈…

美創市場競爭力突出!《2025中國數據安全市場研究報告》發布

數據要素時代,數據已成國家戰略性資源,數據安全關乎國家安全!數說安全發布的《2025中國數據安全市場研究報告》(以下簡稱《報告》)顯示,2024年數據安全市場逆勢增長,市場規模首次突破百億。《報…

VUE Element-ui Message 消息提示組件自定義封裝

為了讓message 信息提示的更加方便快捷,減少不同地方的調用,避免代碼的重復,特意再官方message 組件的基礎上二次封裝,使代碼更加的優雅和高效。 實現效果: 代碼組件: 封裝成 message.js 文件,…

高防IP能抵御哪些類型的網絡攻擊?

高防IP(High Defense IP)是一種專門針對網絡攻擊設計的防護服務,主要通過流量清洗、協議分析、行為檢測等技術抵御多種網絡攻擊。以下是其能防御的主要攻擊類型及原理: ??一、常見防御的攻擊類型?? ??DDoS攻擊(分…

小紅書文字配圖平替工具

小紅書的文字配圖只有手機版有,想找一個電腦版的,查了一下。以下是幾款類似小紅書風格的花字、藝術字生成工具,適合制作吸睛的社交媒體配圖,分為 手機APP 和 在線工具 兩類,供你選擇: 一、手機APP推薦 醒圖…

【浙江大學DeepSeek公開課】走向數字社會:從DeepSeek到群體智慧

從DeepSeek到群體智慧 一、人工智能發展脈絡二、DeepSeek大模型的意義與特點三、人工智能促進社會數字化轉型四、群體智慧與數字社會 一、人工智能發展脈絡 圖靈與圖靈機:1937年,圖靈發表論文《On computable numbers, with an application to the Ents…

解讀大型語言模型:從Transformer架構到模型量化技術

一、生成式人工智能概述 生成式人工智能(Generative Artificial Intelligence)是一種先進的技術,能夠生成多種類型的內容,包括文本、圖像、音頻以及合成數據等。其用戶界面的便捷性極大地推動了其廣泛應用,用戶僅需在…

JSON實現動態按鈕管理的Python應用

在開發桌面應用程序時,動態生成用戶界面元素并根據配置文件靈活管理是一項常見需求。本文將介紹如何使用Python的wxPython庫結合JSON配置文件,開發一個支持動態按鈕創建、文件執行和配置管理的桌面應用程序。該應用允許用戶通過設置界面配置按鈕名稱和關…

序章:寫在前面

目錄 為什么要學習 Python?那么,Python 到底是什么呢?Python 的用戶多嗎?Python 的語法究竟是怎樣的?C 語言JavaPython Python 好學嗎? 為什么要學習 Python? 這個問題或許會讓不少人感到不解。…

onlyoffice歷史版本功能實現,版本恢復功能,編輯器功能實現 springboot+vue2

文章目錄 oonlyoffice歷史版本功能實現 (編輯器功能實現)springbootvue2前提 需要注意把這個 (改成自己服務器的ip或者域名) 改成 自己服務器的域名或者地址1. onloyoffice 服務器部署 搜索其他文章2. 前段代碼 vue 22.1 需要注意把這個 (改成自己服務器…

解決ubuntu server修改為中文后亂碼問題(改回英文)

操作步驟 1.安裝英文語言包 sudo apt-get install language-pack-en2.編輯/etc/default/locale文件 sudo vim /etc/default/locale修改為以下內容: LANG"en_US.UTF-8" LANGUAGE"en_US:en" LC_ALL"en_US.UTF-8"3.應用配置 sudo l…

安卓的Launcher 在哪個環節進行啟動

安卓Launcher在系統啟動過程中的關鍵環節啟動,具體如下: 內核啟動:安卓設備開機后,首先由引導加載程序啟動Linux內核。內核負責初始化硬件設備、建立內存管理機制、啟動系統進程等基礎工作,為整個系統的運行提供底層支…

數據通信學習筆記之OSPF其他內容2

OSPF 與 BFD 聯動 網絡上的鏈路故障或拓撲變化都會導致設備重新進行路由計算,所以縮短路由協議的收斂時間對于提高網絡的性能是非常重要的。 OSPF 與 BFD 聯動就是將 BFD 和 OSPF 關聯起來,一旦與鄰居之間的鏈路出現故障,BFD 對完品以&…

數據庫原理及應用mysql版陳業斌實驗四

🏝?專欄:Mysql_貓咪-9527的博客-CSDN博客 🌅主頁:貓咪-9527-CSDN博客 “欲窮千里目,更上一層樓。會當凌絕頂,一覽眾山小。” 目錄 實驗四索引與視圖 1.實驗數據如下 student 表(學生表&…

[密碼學實戰]密評考試訓練系統v1.0程序及密評參考題庫(獲取路徑在文末)

[密碼學實戰]密評考試訓練系統v1.0程序及密評參考題庫 引言:密評考試的重要性與挑戰 商用密碼應用安全性評估(簡稱"密評") 作為我國密碼領域的重要認證體系,已成為信息安全從業者的必備技能。根據國家密碼管理局最新數據,截至2024年6月,全國僅有3000余人持有…

藍橋杯練習題2

動態規劃 動態規劃三大題型:計數問題、最值問題、存在性問題; 【最小權值】-- 最值問題 【題目分析】 import java.util.Arrays; Arrays類中的一個方法:Arrays.fill(int[] m,int n) //給 int 類型(或者char類型/Long類型...)的數組全部空間…

【集群IP管理分配技術_DHCP】二、DHCP核心功能與技術實現

一、智能 IP 地址分配功能與技術實現? 1.1 功能概述? 智能 IP 地址分配是 DHCP 中間件的核心功能之一,它打破了傳統 DHCP 固定的分配模式,能夠根據網絡的實時狀態、客戶端類型、接入位置等多種因素,動態且合理地分配 IP 地址。例如&#…