結構型模式 (Python版)

代理模式

from abc import ABC, abstractmethod# 買的行為(抽象類)
class Buy(ABC):@abstractmethoddef buy_ticket(self):pass# 男人(具體類)
class Man(Buy):# 男人買票def buy_ticket(self):print("Man 買票成功!")# 女人(具體類)
class Woman(Buy):# 女人買票def buy_ticket(self):print("Woman 買票成功!")# 代理(抽象類)
class Agency(ABC):def __init__(self, people: Buy):self._people = people  # 用來保存要代理的對象(男人或女人)@abstractmethoddef click_to_buy_ticket(self):pass# 美團代理(具體類)
class MeiTuan(Agency):def click_to_buy_ticket(self):print("正在通過美團進行買票...")self._people.buy_ticket()# 攜程代理(具體類)
class XieCheng(Agency):def click_to_buy_ticket(self):print("正在通過攜程進行買票...")self._people.buy_ticket()if __name__ == '__main__':man = Man()  # 實例化一個男人woman = Woman()  # 實例化一個女人man.buy_ticket()  # 男人直接自己買票woman.buy_ticket()  # 女人直接自己買票meituan = MeiTuan(man)  # 男人使用(打開)了美團meituan.click_to_buy_ticket()  # 通過美團進行買票xiecheng = XieCheng(woman)  # 女人使用(打開)了攜程xiecheng.click_to_buy_ticket()  # 通過攜程進行買票

裝飾者模式

from abc import ABC, abstractmethod# 人物(抽象類)
class People(ABC):def __init__(self):self._wearingState = ""  # 記錄人物的穿著狀態@abstractmethoddef show(self):  # 展示人物的穿著狀態pass# 女孩(具體類)
class Girl(People):def __init__(self):super().__init__()self._wearing_state = "女孩穿著,長褲睡衣,長袖睡衣"def show(self):print(self._wearing_state)# 男孩(具體類)
class Boy(People):def __init__(self):super().__init__()self._wearing_state = "男孩穿著,短褲睡衣,短袖睡衣"def show(self):print(self._wearing_state)# 換裝(抽象類)
class ChangeClothes(ABC):def __init__(self, people: People):self._people = people  # 維護一個要進行換裝的對象(男孩或女孩)self._changed_state = ""  # 記錄換裝后的穿著狀態# 展示最新的穿著狀態@abstractmethoddef show(self):pass# 換成校服
class ChangeIntoSchoolUniform(ChangeClothes):def __init__(self, people: People):super().__init__(people)self._changed_state = "但是最后換成了校服"# 展示最新的穿著狀態def show(self):self._people.show()print(self._changed_state)# 換成運動裝
class ChangeIntoSportswear(ChangeClothes):def __init__(self, people: People):super().__init__(people)self._changed_state = "但是最后換成了運動裝"# 展示最新的穿著狀態def show(self):self._people.show()print(self._changed_state)if __name__ == '__main__':# 實例化一個男生,并展示他的穿著狀態boy = Boy()boy.show()# 實例化一個女生,并展示她的穿著狀態girl = Girl()girl.show()# -------------------- 裝飾 - -------------------# 讓男生穿上運動裝,并再次展示他的穿著狀態boy = ChangeIntoSportswear(boy)boy.show()# 讓女生穿上校服,并再次展示她的穿著狀態girl = ChangeIntoSportswear(girl)girl.show()

適配器模式

對象適配器

"""電源插座案例:三插頭和兩插頭的適配用戶本身只有三插頭用戶現在需要將三插頭轉換為兩插頭
"""from abc import ABC, abstractmethod# 三插頭(具體類)
class ThreePlug:# 讓三插頭進行充電def three_plug_charge(self):print("開始充電...")# 兩插頭形狀(抽象類)
class TwoPlugShape(ABC):# 讓兩插頭進行充電(抽象)@abstractmethoddef two_plug_charge(self):pass# 兩插頭(具體類)
class TwoPlug(TwoPlugShape):# 讓兩插頭進行充電(實現)def two_plug_charge(self):print("開始充電...")# 插頭轉換器(本質是一個兩插頭,里面維護了一個三插頭對象)
class PlugConverter(TwoPlugShape):def __init__(self, obj: ThreePlug):self._three_plug = obj  # 保存(維護)一個三插頭對象# 讓兩插頭進行充電(實現)def two_plug_charge(self):print("溫馨提示:您正在使用插頭轉換器")  # 插頭轉換器新增的提示功能self._three_plug.three_plug_charge()  # 保持使用三插頭原本的充電功能if __name__ == '__main__':# 實例化一個三插頭three_plug = ThreePlug()# 先嘗試一下直接充電three_plug.three_plug_charge()# 在三插頭上面安裝一個轉換器,將其轉成兩插頭(即:實例化一個插頭轉換器)two_plug = PlugConverter(three_plug)# 對它進行充電two_plug.two_plug_charge()

類適配器

"""電源插座案例:三插頭和兩插頭的適配用戶本身只有三插頭用戶現在需要將三插頭轉換為兩插頭
"""from abc import ABC, abstractmethod# 三插頭(具體類)
class ThreePlug:# 讓三插頭進行充電def three_plug_charge(self):print("開始充電...")# 兩插頭形狀(抽象類)
class TwoPlugShape(ABC):# 讓兩插頭進行充電(抽象)@abstractmethoddef two_plug_charge(self):pass# 兩插頭(具體類)
class TwoPlug(TwoPlugShape):# 讓兩插頭進行充電(實現)def two_plug_charge(self):print("開始充電...")# 插頭轉換器(通過同時繼承兩插頭和三插頭實現轉換)
class PlugConverter(TwoPlugShape, ThreePlug):# 讓兩插頭進行充電(實現)def two_plug_charge(self):print("溫馨提示:您正在使用插頭轉換器")  # 插頭轉換器新增的提示功能self.three_plug_charge()  # 保持使用三插頭原本的充電功能if __name__ == '__main__':# 實例化一個三插頭three_plug = ThreePlug()# 先嘗試一下直接充電three_plug.three_plug_charge()# 實例化一個插頭轉換器,它內部自帶三插頭,但是對外顯示兩插頭two_plug = PlugConverter()# 對它進行充電two_plug.two_plug_charge()

橋接模式

"""案例:生成圖案要求:顏色類和形狀類進行搭配,生成圖案:"紅色圓形"、"藍色圓形"、"紅色矩形"、"藍色矩形"1. 顏色有兩個:紅色、藍色2. 形狀有兩個:圓形、矩形
"""from abc import ABC, abstractmethod# 顏色(抽象類)
class Color(ABC):@abstractmethoddef fill_color(self):pass# 紅色(具體類)
class Red(Color):def fill_color(self):print("填充了紅色")# 藍色(具體類)
class Blue(Color):def fill_color(self):print("填充了藍色")# 形狀(抽象類)
class Shape(ABC):def __init__(self):self._color = None  # 用來存放(維護)一個顏色對象def set_color(self, color: Color):  # 設置顏色對象self._color = color@abstractmethoddef _draw_shape(self):  # 畫出形狀passdef generate(self):  # 生成圖案(形狀+顏色)self._draw_shape()self._color.fill_color()# 圓形形狀(具體類)
class Circle(Shape):def _draw_shape(self):print("畫出了圓形 ", end="")# 矩形形狀(具體類)
class Rectangle(Shape):def _draw_shape(self):print("畫出了矩形 ", end="")if __name__ == '__main__':# 創建對象red = Red()  # 創建一個紅色對象blue = Blue()  # 創建一個藍色對象circle = Circle()  # 創建一個圓形對象rectangle = Rectangle()  # 創建一個矩形對象# 生成圖案# 1. 紅色圓形circle.set_color(red)circle.generate()# 2. 藍色圓形circle.set_color(blue)circle.generate()# 3. 紅色矩形rectangle.set_color(red)rectangle.generate()# 4. 藍色矩形rectangle.set_color(blue)rectangle.generate()

外觀模式

"""編譯過程是比較復雜的,通常包含以下內容:- 編譯器在后臺進行語法分析- 生成中間代碼	(預處理)- 生成匯編代碼	(編譯)- 生成機器碼		(匯編)- 生成可執行程序	(鏈接)雖然如此,現實中 IDE(集成開發環境) 通常能夠給我們提供一鍵編譯的方法,方便了我們的開發下面,我們將模擬這個過程
"""from abc import ABC, abstractmethod# 語法分析
class SyntaxAnalyzer:def syntax_parser(self):print("分析語法中...")# 中間代碼
class MidCode:def generate_middle_code(self):print("生成中間代碼中...")# 匯編代碼
class AssemblyCode:def generate_assembly_code(self):print("生成匯編代碼中...")# 機器碼
class BinaryCode:def generate_binary_code(self):print("生成機器碼中...")# 鏈接
class Link:def generate_program(self):print("生成可執行程序中...")# IDE(繼承開發環境)
class IDE:# 編譯def compile(self):# 創建對象sa = SyntaxAnalyzer()mc = MidCode()ac = AssemblyCode()bc = BinaryCode()lk = Link()sa.syntax_parser()mc.generate_middle_code()ac.generate_assembly_code()bc.generate_binary_code()lk.generate_program()print("程序運行中...")if __name__ == '__main__':python_IDE = IDE()python_IDE.compile()  # 一鍵編譯

享元模式

"""享元模式(Flyweight Mode)案例:用戶訪問多個相似的網站,這些相似的網站之間,有共享的部分,也有自己獨有的部分
"""from abc import ABC, abstractmethod# 用戶類
class User:def __init__(self, username):self._username = username# 向外提供訪問用戶名字的接口@propertydef name(self):return self._username# 網站類(抽象)
class AbstractWebsite(ABC):@abstractmethoddef show_page(self, user: User):  # 網站為用戶提供了展示頁面的功能pass# 網站類(具體)
class Website(AbstractWebsite):def __init__(self, web_name: str):self._web_name = web_namedef show_page(self, user: User):print(f"網站:{self._web_name} 正在為用戶:{user.name} 展示頁面")# 網站工廠
class WebsiteFactory:def __init__(self):self._website_dict = {}  # 網站字典  (key: value)<==>(web名字: web對象)# 生成網站def generate_website(self, web_name: str):# 判斷網站字典中是否存在名字為 web_name 的網站,如果沒有就創建一個if web_name not in self._website_dict:self._website_dict[web_name] = Website(web_name)return self._website_dict.get(web_name)# 查看網站數量def check_website_count(self):return len(self._website_dict)if __name__ == '__main__':# 實例化一個網站工廠web_factory = WebsiteFactory()# 讓工廠生產出三個網站web_1 = web_factory.generate_website("華為官網")web_2 = web_factory.generate_website("小米官網")web_3 = web_factory.generate_website("騰訊官網")# 實例化三個用戶user_1 = User("小明")user_2 = User("小帥")user_3 = User("小美")# 讓三個網站,展示頁面給三個用戶看web_1.show_page(user_1)web_2.show_page(user_1)web_3.show_page(user_1)print("--------------")web_1.show_page(user_2)web_2.show_page(user_2)web_3.show_page(user_2)print("--------------")web_1.show_page(user_3)web_2.show_page(user_3)web_3.show_page(user_3)print("--------------")

組合模式

from abc import ABC, abstractmethod"""案例:通過組合模式,模仿并實現一個簡單的目錄文件系統
"""# 容器(抽象類)
class Container(ABC):@abstractmethoddef get_name(self):  # 獲取名字pass@abstractmethoddef add(self, obj):  # 添加內容pass@abstractmethoddef remove(self, obj):  # 移除內容pass@abstractmethoddef get_children(self):  # 獲取所有的子對象pass# 目錄(具體類)
class Directory(Container):def __init__(self, directory_name: str):self._directory_name = directory_nameself._children_list = []  # 孩子列表,用來存放所有的子對象(目錄的子對象可以是文件對象,也可以是目錄對象)def get_name(self):  # 獲取目錄的名字return self._directory_namedef add(self, obj):  # 向目錄里面添加子對象self._children_list.append(obj)def remove(self, obj):  # 移除目錄里面的子對象self._children_list.remove(obj)def get_children(self):  # 獲取目錄下的所有的子對象return self._children_list# 文件(具體類)
class File(Container):def __init__(self, file_name: str):self._file_name = file_nameself._children_list = []  # 孩子列表,用來存放所有的子對象(雖然文件沒有子對象,但是為了格式與上面的統一,就保持風格寫了這些代碼,即:這些代碼沒有具體的現實意義)def get_name(self):  # 獲取文件的名字return self._file_namedef add(self, obj):  # 向文件里面添加子對象(為了保持格式統一,沒有具體的現實意義)passdef remove(self, obj):  # 移除文件里面的子對象(為了保持格式統一,沒有具體的現實意義)passdef get_children(self):  # 獲取文件下的所有的子對象(為了保持格式統一,沒有具體的現實意義)return self._children_list# 目錄節點樹(用來顯示目錄的內容與結構)
def show_tree(obj: Container, width: int):# ------- 展示當前目錄 -------i = 0while i < width:print("---", end="")i += 1print(obj.get_name())  # 展示當前對象的名稱# ------- 展示當前目錄 -------# ------- 展示當前目錄下的子對象 -------children = obj.get_children()  # 獲取當前目錄所有的孩子對象,children 本質是列表if not children:  # 不存在子對象,直接返回return Nonefor obj in children:  # 將對象逐個遍歷出來show_tree(obj, width + 1)# ------- 展示當前目錄下的子對象 -------if __name__ == '__main__':# 實例化一個目錄,作為根目錄root_directory = Directory("C:")# 實例化一個目錄,作為子目錄,并將其添加到根目錄中child_directory = Directory("User")root_directory.add(child_directory)# 實例化四個文件,將前面兩個文件添加到根目錄中,后面兩個文件添加到子目錄中file_1 = File("a.txt")file_2 = File("b.txt")file_3 = File("c.txt")file_4 = File("d.txt")root_directory.add(file_1)root_directory.add(file_2)child_directory.add(file_3)child_directory.add(file_4)# 查看根目錄的"目錄節點樹"show_tree(root_directory, 1)"""
運行結果:---C:
------User
---------c.txt
---------d.txt
------a.txt
------b.txt"""

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

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

相關文章

【輸入示例100,999 輸出示例4】水仙花數

// “水仙花數”是指一個三位正整數&#xff0c;其各位上的數字的立方和等于該數本身。如:1^35^33^3153&#xff0c;因此153是一個水仙花數。輸入兩個三位正整數a和b(其中a<b)&#xff0c;求[a,b]范圍內水仙花數的個數。 //輸入示例100,999 //輸出示例4 #include <stdio.…

AI爆文寫作:如果你有一篇文章爆了,正確的做法是:自己抄襲自己,重復發,還可以繼續爆!

爆款總是相似的&#xff0c;如果你有一篇文章爆了&#xff0c;正確的做法&#xff0c;就是重復發&#xff0c;讓它繼續爆下去。 以前我在小紅書看到一個人&#xff0c;將一篇自己火的筆記&#xff0c;連續發了5次&#xff0c;每次點贊數據都不錯。 公眾號文章也是一樣的。 我…

Gin與OpenAPI(Swagger)的使用

一、背景 1、swagger與openapi Swagger&#xff1a; 一種用于描述RESTFUL API的規范&#xff0c;它提供了一種簡單的來描述API的請求和相應參數、錯誤碼、返回數據類型等信息&#xff0c;是開發者可以方便了解API使用方式。 官網: https://swagger.io/ OpenAPI : 始于 …

gazebo仿真不起飛——QGC地面站查看下是否參數正確

檢查方法&#xff1a;打開QGC地面站查看是否能夠切入定點模式&#xff0c;不能的話查看定位數據來源參數

uniapp(微信小程序)退出小程序方法

一、描述 場景是&#xff1a;當用戶不予授權的時候&#xff0c;不允許使用該小程序&#xff0c;在用戶點擊取消之后&#xff0c;應該關閉當前小程序&#xff0c;不讓他繼續使用。 二、代碼 uni.exitMiniProgram({success: function() {console.log(退出小程序成功);},fail: …

鴻蒙HarmonyOS實戰-Stage模型(信息傳遞載體Want)

&#x1f680;前言 應用中的信息傳遞是為了實現各種功能和交互。信息傳遞可以幫助用戶和應用之間進行有效的溝通和交流。通過信息傳遞&#xff0c;應用可以向用戶傳遞重要的消息、通知和提示&#xff0c;以提供及時的反饋和指導。同時&#xff0c;用戶也可以通過信息傳遞向應用…

FPGA 第4章 攝像頭Bayer轉rgb

參考文獻 彩色MT9V034攝像頭 Bayer轉rgb FPGA實現 https://www.cnblogs.com/hqz68/p/10413896.html 文章目錄 前言Bayer轉rgb算法解析 總結 前言 Bayer格式是相機內部的原始數據, 一般后綴名為.raw。 對于彩色圖像,一般是三原色數據&#xff0c;rgb格式。但是攝像頭一個像素…

【linux-IMX6ULL-LED字符驅動框架完善】

目錄 1.簡介&#xff12;.前置知識2.1 重要函數及結構體2.2 程序框架流程 3. 代碼詳解&#xff1a; 1.簡介 在上節&#xff0c;我對linux-IMX6ULL-字符設備驅動簡單框架實驗進行了說明和構建&#xff0c;但是也存在幾個問題&#xff1b; 需要手動指定設備號&#xff0c;不能自…

TCP 與 UDP

0. tcp 與 udp 的 異同特性 TCPUDPname傳輸控制協議用戶數據報協議面向連接&#xff1f; 需要 傳輸數據前建立連接傳輸完畢后斷開連接不需要可靠的傳輸數據&#xff1f; 可靠 有確認機制&#xff08;三次握手&#xff09; 有確認、窗口、重傳、擁塞控制的機制保證數據可靠傳輸…

itertools拼裝迭代器

itertools拼裝迭代器 連接多個迭代器 內置的itertools模塊有一些函數可以把多個迭代器連城一個使用。 chain chain可以把多個迭代器從頭到尾連成一個迭代器。 import itertoolsit itertools.chain([1, 2, 3], [4, 5, 6]) print(list(it))>>> [1, 2, 3, 4, 5, 6]…

操作視頻號小店,新手最關心的問題,一篇給你講解清楚!

大家好&#xff0c;我是電商小V 新手去做視頻號小店的時候&#xff0c;心里面一定是有很多疑問的&#xff0c;會反復咨詢一些最關心的問題&#xff0c;因為他們要做好準備&#xff0c;以防后續做店過程中出現問題&#xff0c;其實新手關心的問題就那幾個&#xff0c;咱們今天就…

C++貪心算法3

過河的最短時間 #include<bits/stdc.h> using namespace std; void f(int); int n; int main() {system("color 1");cin>>n;int a[10010];for(int i0;i<n;i){cin>>a[i];}sort(a0,an);int ta[1];int k1n-2;int k2n-1;while(true){int t1a[0]a[k…

springboot2+mybatis-plus+vue3創建入門小項目[學生管理系統]02[實戰篇]

創建一個 vue 項目 創建這個新的文件夾 創建前端項目 eggbox 數據庫 SQL CREATE DATABASE IF NOT EXISTS egg DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; USE egg;CREATE TABLE stu (id INT AUTO_INCREMENT, -- 自增主鍵name VARCHAR(64) NOT NULL, -- 非空姓名字段&a…

前端傳參的三種方式

1、params 傳參 參數拼接在地址 url 的后面給后臺&#xff1b;地址欄中可見 案例1 地址欄&#xff1a;https://xxxxxxxx/admin/clues/detail?id558 接口代碼&#xff1a; export function getClueDetail(query: any) {return request<clueItem>({url: /clues/detai…

Java:圖書管理系統

目錄 一.book 1.在book包中的Book 類用來定義和引用書的名字&#xff0c;作者&#xff0c;價格&#xff0c;類型等。 2.在book包中的第二個類是BookList是用來構建書架&#xff0c;和書架上的初始書本&#xff0c; 二、ioperations 1.AddOperation (增加圖書) 2.BorrowOp…

保研機試算法訓練個人記錄筆記(七)

輸入格式&#xff1a; 在第1 行給出不超過10^5 的正整數N, 即參賽&#xff5d;人數。隨后N 行&#xff0c;每行給出一位參賽者的 信息和成績&#xff0c;包括其所代表的學校的編號&#xff08;從1 開始連續編號&#xff09;及其比賽成績&#xff08;百分制&#xff09;&#xf…

Linux環境基礎開發工具的使用(yum,vim,gcc/g++,make/Makefile,gdb)

Linux 軟件包管理器-yum 什么是軟件包及安裝方式 在Linux下安裝軟件, 一個通常的辦法是下載到程序的源代碼, 并進行編譯, 得到可執行程序。 但是這樣太麻煩了, 于是有些人把一些常用的軟件提前編譯好, 做成軟件包(可以理解成windows上的安裝程序)放在一個服務器上, 通過包管理…

數據結構——棧(詳細分析)

目錄 &#x1f349;引言 &#x1f349;棧的本質和特點 &#x1f348;棧的基本操作 &#x1f348;棧的特點 &#x1f34d;后進先出 &#x1f34d;操作受限 &#x1f34d;動態調整 &#x1f348;棧的優缺點 &#x1f34d;優點 &#x1f34d;缺點 &#x1f349;棧的應用…

002 遞歸評論 mongodb websocket消息推送

文章目錄 商品評論CommentController.javaComment.javaCommentServiceImpl.javaCommentRepository.javaCommentService.javaWebSocketConfig.javaWebSocketProcess.javaapplication.yamlproductReview.htmlindex.htmlindex.jsindex.css 訂單評論EvaluateMapper.xmlEvaluateMapp…

從零手寫實現 nginx-01-為什么不能有 java 版本的 nginx?

前言 大家好&#xff0c;我是老馬。很高興遇到你。 作為一個 java 開發者&#xff0c;工作中一直在使用 nginx。卻發現一直停留在使用層面&#xff0c;無法深入理解。 有一天我在想&#xff0c;為什么不能有一個 java 版本的 nginx 呢&#xff1f; 一者是理解 nginx 的設計…