Python常見設計模式2: 結構型模式

文章目錄

  • 適配器模式
  • 橋接模式
  • 組合模式
  • 外觀模式
  • 代理模式


適配器模式

  • 將一個類的接口轉換成客戶希望的另一個接口。適配器模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。
  • 兩種實現方式:
    • 類適配器:使用多繼承
    • 對象適配器:使用組合
# 適配器模式
from abc import ABCMeta, abstractmethodclass Payment(metaclass=ABCMeta):@abstractmethoddef pay(self, money):passclass Alipay(Payment):def pay(self, money):print("支付寶支付%d元。" % money)class WechatPay(Payment):def pay(self, money):print("微信支付%d元。" % money)class BankPay:def cost(self, money):print("銀聯支付%d元。" % money)# 類適配器
# class NewBankPay(Payment, BankPay):
#     def pay(self, money):
#         self.cost(money)# 對象適配器
class PaymentAdapter(Payment):def __init__(self, payment):self.payment = paymentdef pay(self, money):self.payment.cost(money)p = PaymentAdapter(BankPay())
p.pay(100)

橋接模式

  • 將一個事物的兩個維度分離,使其都可以獨立地變化。
from abc import ABCMeta, abstractmethodclass Shape(metaclass=ABCMeta):def __init__(self, color):self.color = color@abstractmethoddef draw(self):passclass Color(metaclass=ABCMeta):@abstractmethoddef paint(self, shape):passclass Rectangle(Shape):name = "長方形"def draw(self):# TODO:矩形邏輯self.color.paint(self)class Circle(Shape):name = "圓形"def draw(self):# TODO:原型邏輯self.color.paint(self)class Red(Color):def __init__(self,shape):self.shape=shapedef paint(self):print("紅色的%s" % self.shape.name)class Green(Color):def __init__(self,shape):self.shape=shapedef paint(self):print("綠色的%s" % self.shape.name)shape = Rectangle(Red())
shape.draw()shape2 = Circle(Green())
shape2.draw()

組合模式

  • 將對象組合成樹形結構以表示“部分-整體”的層次結構。組合模式是用戶對單個對象和組合對象的使用都具有一致性。
  • 角色:
    • 抽象組件(Component)
    • 葉子組件(Leaf)
    • 復合組件(Composite)
    • 客戶端(Client)
from abc import ABCMeta, abstractmethod
# 抽象組件class Graphic(metaclass=ABCMeta):@abstractmethoddef draw(self):pass# 葉子組件
class Point(Graphic):def __init__(self, x, y):self.x = xself.y = ydef __str__(self):return "點(%s, %s)" % (self.x, self.y)def draw(self):print(str(self))class Line(Graphic):def __init__(self, p1, p2):self.p1 = p1self.p2 = p2def __str__(self):return "線段(%s, %s)" % (self.p1, self.p2)def draw(self):print(str(self))# 復合組件
class Picture(Graphic):def __init__(self, iterable):self.children = []for g in iterable:self.add(g)def add(self, graphic):self.children.append(graphic)def draw(self):print("*"* 100)print("----復合圖形 start----")for g in self.children:g.draw()print("----復合圖形 end----")# 線段
l = Line(Point(1, 1), Point(2, 2))
print(l)# 點跟線組合
p1 = Point(2, 3)
l1 = Line(Point(2, 4), Point(6, 7))
l2 = Line(Point(1, 5), Point(2, 8))
pic1 = Picture([p1, l1, l2])
# pic1.draw()# pic1跟 pic2再次組合
l3 = Line(Point(2, 4), Point(6, 7))
l4 = Line(Point(1, 5), Point(2, 8))
pic2 = Picture([l3, l4])
pic3 = Picture([pic1, pic2])
pic3.draw()
# 此處csdn運行代碼可能出問題,理論上應該有三次**********

外觀模式

  • 為子系統的一組接口提供一個一致的界面,外觀模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。
  • 角色:
    • 外觀(Facade)
    • 子系統類(Sub system classes)
class CPU:def run(self):print("CPU開始運行")def stop(self):print("CPU停止運行")class Disk:def run(self):print("硬盤開始運行")def stop(self):print("硬盤停止運行")class Memory:def run(self):print("內存開始運行")def stop(self):print("內存停止運行")class Computer:     # Facadedef __init__(self):self.cpu = CPU()self.disk = Disk()self.memory = Memory()def run(self):self.cpu.run()self.disk.run()self.memory.run()def stop(self):self.memory.stop()self.disk.stop()self.cpu.stop()computer = Computer()
computer.run()
print(f"計算機正在運行。。。")
computer.stop()

代理模式

  • 為其他對象提供一種代理以控制對這個對象的訪問
  • 應用場景:
    • 遠程代理:為遠程的對象提供代理
    • 虛代理:可在需要時才創建對象,減少內存消耗
    • 保護代理:控制對原始對象的訪問,用于對象有不同訪問權限時

建議在py源文件同級目錄下創建一個test.txt文件

Initial Context.
"""
角色:抽象實體(Subject)實體(RealSubject)代理(Proxy)
"""from abc import ABCMeta, abstractmethodclass Subject(metaclass=ABCMeta):@abstractmethoddef get_content(self):pass@abstractmethoddef set_content(self, content):passclass RealSubject(Subject):def __init__(self, filename):self.filename = filename# 嘗試讀取文件,如果文件不存在則初始化為空內容try:with open(filename, 'r') as f:self.content = f.read()except FileNotFoundError:self.content = ""def get_content(self):return self.contentdef set_content(self, content, new_filename=None):# 如果提供了新文件名,則更新當前實例的文件名if new_filename:self.filename = new_filename# 寫入內容(如果文件不存在會自動創建)with open(self.filename, 'w') as f:f.write(content)self.content = contentclass VirtualProxy(Subject):def __init__(self, filename):self.filename = filenameself.subj = Nonedef get_content(self):if not self.subj:self.subj = RealSubject(self.filename)return self.subj.get_content()def set_content(self, content):if not self.subj:self.subj = RealSubject(self.filename)return self.subj.set_content(content)class ProtectedProxy(Subject):def __init__(self, filename):self.subj = RealSubject(filename)def get_content(self):return self.subj.get_content()def set_content(self, content):raise PermissionError("無寫入權限")subj = RealSubject("test.txt")
subj.set_content("Testing Context.")
print(subj.get_content())print("---- VirtualProxy")
v_subj = VirtualProxy("test.txt")
print(v_subj.get_content())print("---- ProtectedProxy")
p_subj = ProtectedProxy("test.txt")
print(p_subj.get_content())
# p_subj.set_content("aaa")
# 會輸出PermissionError

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

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

相關文章

HDMI2.1 8K驗證平臺

本文推薦其中一個平臺ZCU106HDMI2.1 FMC Card 一、ZCU106主要特性與優勢 經過優化,可采用 Zynq Ultrascale MPSoC 快速進行應用原型設計集成型視頻編解碼器單元支持 H.264/H.265HDMI 視頻輸入輸出PCIe 端點 Gen3x4、USB3、DisplayPort 和 SATADDR4 SODIMM – 64 位…

R語言使用隨機森林對數據進行插補

數據插補的目的是為了恢復數據的完整性,以便后續的數據分析和挖掘工作能夠順利進行。插補方法的選擇取決于數據的特點和缺失模式。常見的插補方法包括均值插補、回歸插補、多重插補等。均值插補簡單易行,但可能會改變數據分布;回歸插補考慮了…

論文閱讀:ICLR 2024 GAIA: A Benchmark for General AI Assistants

https://arxiv.org/pdf/2311.12983 https://www.doubao.com/chat/18484357054754562 GAIA: A Benchmark for General AI Assistants GAIA:通用人工智能助手基準測試 該論文介紹了GAIA(General AI Assistants)基準測試,這是一…

【Cmake】靜態庫(編譯-鏈接-引用)相關函數

目錄 一.file 1.1.示例一 1.2.示例二 1.2.1.GLOB 1.2.2.GLOB_RECURSE 1.3.示例三 1.3.1.GLOB 1.3.2.GLOB_RECURSE 1.4.file(GLOB)的缺點 二.add_library 示例 1:創建一個簡單的靜態庫 示例 2:創建一個簡單的共享庫(動態庫&#x…

【50頁PPT】鋼鐵企業數字化工廠解決方案需求要點(附下載方式)

篇幅所限,本文只提供部分資料內容,完整資料請看下面鏈接 https://download.csdn.net/download/2501_92796370/91716817 資料解讀:鋼鐵企業數字化工廠解決方案需求要點 詳細資料請看本解讀文章的最后內容 鋼鐵行業數字化轉型背景與意義 當…

Java深拷貝與淺拷貝核心解析

Java深拷貝與淺拷貝的概念淺拷貝(Shallow Copy)只復制對象的引用,而不復制對象本身。拷貝后的對象和原對象共享同一塊內存地址中的子對象。修改其中一個對象的非基本類型屬性時,另一個對象的對應屬性也會被修改。深拷貝&#xff0…

DBeaver 的 PostgreSQL 驅動包默認存儲位置

在 Windows 系統中,DBeaver 的 PostgreSQL 驅動包(JDBC 驅動 JAR 文件)默認存儲位置如下: ###🔍 默認驅動安裝路徑 C:\Users\你的用戶名\AppData\Roaming\DBeaverData\drivers說明:你的用戶名:…

大數據畢業設計選題推薦:基于北京市醫保藥品數據分析系統,Hadoop+Spark技術詳解

🍊作者:計算機畢設匠心工作室 🍊簡介:畢業后就一直專業從事計算機軟件程序開發,至今也有8年工作經驗。擅長Java、Python、微信小程序、安卓、大數據、PHP、.NET|C#、Golang等。 擅長:按照需求定制化開發項目…

Package.xml的字段說明

package.xml 的版本說明 <package format"2"></package>每一個 package.xml 都以作為 root 標簽&#xff0c;其中 format 代表版本,現在主要是版本 2 為主,與版本 1 之間的差別主要是一些子標簽, package.xml 的必備標簽 name:功能包名 version:版本號。…

JAVA【抽象類】和【接口】

在面向對象編程中&#xff0c;接口&#xff08;Interface&#xff09;和抽象類&#xff08;Abstract Class&#xff09;都是用于實現抽象化的機制&#xff0c;但它們在設計目的、語法規則和使用場景上有顯著區別。以下是它們的核心區別&#xff1a; 1. 定義與關鍵字接口&#x…

Mysql系列--11、使用c/c++訪問mysql服務

目錄 一、準備 測試 二、創建對象 三、連接Mysql服務 四、下達指令 3.1增刪改 增加 編碼格式 刪除 修改 3.2查詢結果 結構體理解 打印屬性 打印數據 前面我們已經學習并練習了本地命令行形式的sql語句的使用&#xff0c;可在以后開發中我們一般 不會直接命令行操作數據庫&…

CS144 lab3 tcp_sender

0. 前言 這個實驗做了挺久的&#xff0c;剛開始做的時候官方的代碼庫還是開著的。 調著調著代碼官方把倉庫給刪掉了&#xff0c;又去找別人的代碼倉庫調發現不 對都打算放棄了&#xff0c;過了幾天發現了一個start-code的庫 再合進去簡直完美。這個實驗花的時間應該是前四個里面…

華為HCIP數通學習與認證解析!

大家好&#xff0c;這里是G-LAB IT實驗室。在信息技術飛速發展的今天&#xff0c;隨著華為產品和服務的廣泛應用&#xff0c;成為一名華為數通工程師無疑是許多年輕從業者的目標。然而&#xff0c;對于許多人來說&#xff0c;面對令人眼花繚亂的華為認證體系&#xff0c;不禁要…

深度學習入門Day10:深度強化學習原理與實戰全解析

一、開篇&#xff1a;智能決策的科學與藝術在前九天的學習中&#xff0c;我們掌握了處理各種數據類型的深度學習方法&#xff0c;但這些都屬于"被動學習"——模型從靜態數據中學習模式。今天&#xff0c;我們將進入一個全新的領域&#xff1a;強化學習&#xff08;Re…

Jenkins Pipeline(二)-設置Docker Agent

設計流水線的目的是更方便地使用 Docker鏡像作為單個 Stage或整個流水線的執行環境。 1.安裝必要插件 在Jenkins服務器上已經安裝了插件。 Docker PipelinePipeline Maven IntegrationPipeline Maven Plugin API 如果插件缺少什么&#xff0c;再次檢查并安裝即可。 2. 配…

神經網絡|(十六)概率論基礎知識-伽馬函數·中

【1】引言 前序學習進程中&#xff0c;已經初步了解了伽馬函數&#xff0c;認識到nnn的階乘計算可以轉化為&#xff1a; n!n!?limk→∞kn?k!(nk)!limk→∞kn?k!?n!(nk)!limk→∞kn?k!(n1)(n2)...(nk)n!n! \cdot lim_{k\rightarrow\infty}\frac{k^n\cdot k!}{(nk)!}\\lim_…

設計模式Books Reading

文章目錄 設計模式 創建型設計模式 工廠方法 示例說明 工廠方法模式結構 案例偽代碼 工廠方法模式適合應用 實現方式 工廠方法模式優缺點 與其他模式的關系 概念示例 抽象工廠 抽象工廠模式結構 抽象工廠模式適合應用場景 實現方式 抽象工廠模式優缺點 與其他模式的關系 代碼示…

接吻數問題:從球體堆疊到高維空間的數學奧秘

本文由「大千AI助手」原創發布&#xff0c;專注用真話講AI&#xff0c;回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我&#xff0c;一起撕掉過度包裝&#xff0c;學習真實的AI技術&#xff01; 1 接吻數問題概述 接吻數問題&#xff08;Kissing Number Problem&am…

深度學習③【卷積神經網絡(CNN)詳解:從卷積核到特征提取的視覺革命(概念篇)】

文章目錄先言1. 卷積核&#xff1a;特征檢測的魔法窗口1.1什么是卷積核&#xff1a;可學習的特征檢測器1.2可視化理解&#xff1a;邊緣檢測、紋理提取、特征發現1.3代碼實現&#xff1a;使用PyTorch定義和初始化卷積層2. 卷積運算的數學原理2.1.離散卷積計算&#xff1a;滑動窗…

當不想安裝telnet或nc時,可使用 Linux 系統默認自帶的bash原生網絡功能或ping(輔助判斷)測試連通性

1. 用bash原生/dev/tcp測試端口&#xff08;無需任何工具&#xff09;bashshell 內置了/dev/tcp虛擬設備&#xff0c;可直接通過腳本測試端口是否能連接&#xff0c;執行以下命令&#xff08;替換數據庫 IP 和端口&#xff09;&#xff1a;# 格式&#xff1a;echo > /dev/tc…