代理模式
from abc import ABC, abstractmethod
class Buy ( ABC) : @abstractmethod def 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 @abstractmethod def 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 = "" @abstractmethod def 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 = "" @abstractmethod def 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) : @abstractmethod def 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) : @abstractmethod def 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) : @abstractmethod def 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@abstractmethod def _draw_shape ( self) : pass def 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( ) circle. set_color( red) circle. generate( ) circle. set_color( blue) circle. generate( ) rectangle. set_color( red) rectangle. generate( ) 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 ( "生成可執行程序中..." )
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@property def name ( self) : return self. _username
class AbstractWebsite ( ABC) : @abstractmethod def 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 = { } def generate_website ( self, web_name: str ) : 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) : @abstractmethod def get_name ( self) : pass @abstractmethod def add ( self, obj) : pass @abstractmethod def remove ( self, obj) : pass @abstractmethod def 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) : pass def remove ( self, obj) : pass def get_children ( self) : return self. _children_list
def show_tree ( obj: Container, width: int ) : i = 0 while i < width: print ( "---" , end= "" ) i += 1 print ( obj. get_name( ) ) children = obj. get_children( ) if not children: return None for 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"""