1. 前言上篇文章 寫到了 Python 最常用的 2 種設(shè)計模式,,單例模式和工廠模式 本篇文章我們繼續(xù)聊聊面試中,,Python 面試經(jīng)常被問到的設(shè)計模式,,即: 2. 構(gòu)建者模式構(gòu)建者模式,,是將一個復(fù)雜對象的構(gòu)造與表現(xiàn)進(jìn)行分離,,利用多個步驟進(jìn)行創(chuàng)建,同一個構(gòu)建過程可用于創(chuàng)建多個不同的表現(xiàn) 簡單來說,,就是將一個復(fù)雜對象實例化的過程,,按照自己的想法,一步步設(shè)置參數(shù),,定制一個我們需要的對象 構(gòu)建者模式一般由 Director(指揮官)和 Builder(建設(shè)者)構(gòu)成 其中: Builder 用于定義目標(biāo)對象部件的方法和參數(shù) Director 用于構(gòu)造一個 Builder 的接口,,由 Director 去指導(dǎo) Builder 生成一個復(fù)雜的對象 以購買一輛車( 包含:準(zhǔn)備錢、看車,、試駕,、購買 4 個步驟)為例 首先,定義一個車的實體,,并定義屬性變量 class Car(object): def __init__(self): # 準(zhǔn)備的錢 self.money = None
# 去哪里看車 self.address = None
# 試駕什么車 self.car_name = None
# 購買時間是 self.buy_time = None
def __str__(self): return "準(zhǔn)備了:%s,去%s看車,,試駕了%s,下單了,購買時間是:%s" % (self.money, self.address, self.car_name, self.buy_time)
然后,,創(chuàng)建一個 Builder,,實例化一個 Car 對象,;針對上面 4 個步驟,通過定義 4 個方法 分別是:準(zhǔn)備多少錢,、去哪里看車,、試駕什么車、下單購買的時間 # 創(chuàng)建者 class CarBuilder(object): def __init__(self): self.car = Car()
def ready_money(self, money): """ 準(zhǔn)備的金額 :param money: :return: """ self.car.money = money sleep(0.5) return self
def see_car(self, address): """ 去哪里看車 :param address: :return: """ self.car.address = address sleep(0.5) return self
def test_drive(self, car_name): """ 試駕了什么車 :param car_name: :return: """ self.car.car_name = car_name sleep(0.5) return self
def buy_car(self, buy_time): """ 下單時間 :param buy_time: :return: """ self.car.buy_time = buy_time sleep(0.5) return self
接著,,創(chuàng)建 Director,,創(chuàng)建 build 方法,使用 Builder 一步步構(gòu)建一個車對象并返回 class Director(object): def __init__(self): self.builder = None
def build(self, builder): self.builder = builder self.builder. \ ready_money("100萬"). \ see_car("4S店"). \ test_drive("奧迪Q7"). \ buy_car("2020年8月1日")
# 返回構(gòu)建的對象 return self.builder.car
最后使用的時候,,只需要實例化一個 Builder 對象和 Director 對象,,然后通過 Director 對象構(gòu)建一個車對象即可 if __name__ == '__main__': # 實例化一個構(gòu)建者對象 car_builder = CarBuilder() # 實例化一個負(fù)責(zé)人 director = Director()
# 構(gòu)建的對象 car = director.build(car_builder)
print(car) 3. 代理模式代理模式,會引入一個代理對象以代替真實的對象,,解耦調(diào)用方和被調(diào)用方之間的聯(lián)系首先,,我們定義一個真實對象實體類,并定義一個方法class RealObject(object): """ 實際對象 """ def __init__(self, arg): self.arg = arg
def foo(self): print('參數(shù)值為:', self.arg)
然后,,創(chuàng)建一個代理對象,,在初始化函數(shù) __init__ 中拿到真實對象的實例,定義一個相同的方法,,并調(diào)用真實對象的方法class ProxyObject(object): """ 代理對象 """ def __init__(self, real_object): self.real_object = real_object
def foo(self): # 實際對象調(diào)用 self.real_object.foo() if __name__ == '__main__': # 實例化代理對象 proxy_object = ProxyObject(RealObject('AirPython')) # 調(diào)用方法 proxy_object.foo() 如此,,就實現(xiàn)了代理替換真實對象的目的觀察者模式在 Python 中很常見,會定義了對象之間的一對多依賴關(guān)系,,當(dāng)被觀察者(也稱為主體對象)改變狀態(tài)時,,其他所有觀察者都會收到事件并處理預(yù)定的事情首先,我們創(chuàng)建一個觀察者,,在初始化函數(shù)中注冊到被觀察對象上,,并且自定義一個更新函數(shù)# 觀察者 class Observer(object):
def __init__(self, subject): # 初始化觀察者,并注冊 subject.register(self)
def update(self, arg1): """獲取通知""" print('觀察者收到監(jiān)聽消息,,參數(shù)為:', arg1)
然后,,新建一個被觀察對象,創(chuàng)建注冊觀察者,、注銷觀察者方法class Subject(object):
def __init__(self): # 所有的觀察者 self.observers = [] self.foo = None
def register(self, observer): """添加觀察者""" if observer not in self.observers: self.observers.append(observer) else: print('已經(jīng)存在,,添加失敗,!')
def unregister(self, observer): """注銷觀察者""" try: self.observers.remove(observer) except ValueError: print('注銷觀察者失敗')
接著,,通過模擬修改變量的值,,通知給所有的觀察者def notify(self): """通知所有的觀察者""" for item in self.observers: item.update(self.foo)
def modify_value(self): """ 修改變量的值 :return: """ self.foo = "公眾號:AirPython"
# 修改后,,通知所有觀察者 self.notify()
if __name__ == '__main__': # 主體對象 subject = Subject() # 觀察者 observer = Observer(subject)
# 測試 subject.modify_value() 5. 最后這兩篇一共介紹了 5 種設(shè)計模式,它們在 Python 的各領(lǐng)域中被廣泛使用,,也是面試中最常被問到的幾種設(shè)計模式
|