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