欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
聊聊 Python 面試最常被問(wèn)到的幾種設計模式(下)

1. 前言

上篇文章 寫(xiě)到了 Python 最常用的 2 種設計模式,單例模式和工廠(chǎng)模式

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

  • 構建者模式

  • 代理模式

  • 觀(guān)察者模式

2. 構建者模式

構建者模式,是將一個(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)

3. 代理模式

代理模式,會(huì )引入一個(gè)代理對象以代替真實(shí)的對象,解耦調用方和被調用方之間的聯(lián)系
Python 中的實(shí)現方式也簡(jiǎn)單易懂
首先,我們定義一個(gè)真實(shí)對象實(shí)體類(lèi),并定義一個(gè)方法
class RealObject(object):
    """
    實(shí)際對象
    """

    def __init__(self, arg):
        self.arg = arg

    def foo(self):
        print('參數值為:', self.arg)
然后,創(chuàng )建一個(gè)代理對象,在初始化函數 __init__ 中拿到真實(shí)對象的實(shí)例,定義一個(gè)相同的方法,并調用真實(shí)對象的方法
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()
如此,就實(shí)現了代理替換真實(shí)對象的目的

4. 觀(guān)察者模式

觀(guān)察者模式在 Python 中很常見(jiàn),會(huì )定義了對象之間的一對多依賴(lài)關(guān)系,當被觀(guān)察者(也稱(chēng)為主體對象)改變狀態(tài)時(shí),其他所有觀(guān)察者都會(huì )收到事件并處理預定的事情
首先,我們創(chuàng )建一個(gè)觀(guān)察者,在初始化函數中注冊到被觀(guān)察對象上,并且自定義一個(gè)更新函數
# 觀(guān)察者
class Observer(object):

    def __init__(self, subject):
        # 初始化觀(guān)察者,并注冊
        subject.register(self)

    def update(self, arg1):
        """獲取通知"""
        print('觀(guān)察者收到監聽(tīng)消息,參數為:', arg1)
然后,新建一個(gè)被觀(guān)察對象,創(chuàng )建注冊觀(guān)察者、注銷(xiāo)觀(guān)察者方法
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)察者失敗')
接著(zhù),通過(guò)模擬修改變量的值,通知給所有的觀(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. 最后

這兩篇一共介紹了 5 種設計模式,它們在 Python 的各領(lǐng)域中被廣泛使用,也是面試中最常被問(wèn)到的幾種設計模式

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
[深入淺出Cocoa]詳解鍵值觀(guān)察(KVO)及其實(shí)現機理
如何自己動(dòng)手實(shí)現 KVO
觀(guān)察者(Observer)模式
GoF設計模式之十九 Observer- -
PHP常用設計模式
設計模式
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久