久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

聊聊 Python 面試最常被問到的幾種設(shè)計模式(下)

 AirPython 2021-10-28

1. 前言

上篇文章 寫到了 Python 最常用的 2 種設(shè)計模式,,單例模式和工廠模式

本篇文章我們繼續(xù)聊聊面試中,,Python 面試經(jīng)常被問到的設(shè)計模式,,即:

  • 構(gòu)建者模式

  • 代理模式

  • 觀察者模式

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)系
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)系,,當(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è)計模式

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多