python面试设计模式问题_聊聊 Python 面试最常被问到的几种设计模式(下)
1. 前言
上篇文章 寫到了 Python 最常用的 2 種設(shè)計模式,單例模式和工廠模式
本篇文章我們繼續(xù)聊聊面試中,Python 面試經(jīng)常被問到的設(shè)計模式,即:
構(gòu)建者模式
代理模式
觀察者模式
2. 構(gòu)建者模式
構(gòu)建者模式,是將一個復雜對象的構(gòu)造與表現(xiàn)進行分離,利用多個步驟進行創(chuàng)建,同一個構(gòu)建過程可用于創(chuàng)建多個不同的表現(xiàn)
簡單來說,就是將一個復雜對象實例化的過程,按照自己的想法,一步步設(shè)置參數(shù),定制一個我們需要的對象
構(gòu)建者模式一般由 Director(指揮官)和 Builder(建設(shè)者)構(gòu)成
其中:
Builder 用于定義目標對象部件的方法和參數(shù)
Director 用于構(gòu)造一個 Builder 的接口,由 Director 去指導 Builder 生成一個復雜的對象
以購買一輛車( 包含:準備錢、看車、試駕、購買 4 個步驟)為例
首先,定義一個車的實體,并定義屬性變量
class Car(object):
def __init__(self):
# 準備的錢
self.money = None
# 去哪里看車
self.address = None
# 試駕什么車
self.car_name = None
# 購買時間是
self.buy_time = None
def __str__(self):
return "準備了:%s,去%s看車,試駕了%s,下單了,購買時間是:%s" % (self.money, self.address, self.car_name, self.buy_time)
然后,創(chuàng)建一個 Builder,實例化一個 Car 對象;針對上面 4 個步驟,通過定義 4 個方法
分別是:準備多少錢、去哪里看車、試駕什么車、下單購買的時間
# 創(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):
"""
去哪里看車
: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()
# 實例化一個負責人
director = Director()
# 構(gòu)建的對象
car = director.build(car_builder)
print(car)
3. 代理模式
代理模式,會引入一個代理對象以代替真實的對象,解耦調(diào)用方和被調(diào)用方之間的聯(lián)系
Python 中的實現(xià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)了代理替換真實對象的目的
4. 觀察者模式
觀察者模式在 Python 中很常見,會定義了對象之間的一對多依賴關(guān)系,當被觀察者(也稱為主體對象)改變狀態(tài)時,其他所有觀察者都會收到事件并處理預定的事情
首先,我們創(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è)計模式
我已經(jīng)將文中全部源碼上傳到后臺,關(guān)注公眾號后回復「 設(shè)計模式 」即可獲得全部源碼
如果你覺得文章還不錯,請大家 點贊、分享、留言下,因為這將是我持續(xù)輸出更多優(yōu)質(zhì)文章的最強動力!
總結(jié)
以上是生活随笔為你收集整理的python面试设计模式问题_聊聊 Python 面试最常被问到的几种设计模式(下)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 多进程 多核_go/nod
- 下一篇: dev项目属性按钮是灰色_Spring