只要五分鐘,帶你學會策略模式

TechFlow2019發表於2021-02-05

大家好,今天給大家介紹一個新的設計模式——策略模式

策略模式的內容非常簡單,五分鐘就可以學會。嚴格來說,這既可以當做是一種設計模式,也可以當做是一種函數語言程式設計的思想

函數語言程式設計

我們之前在介紹Python的語言特性的時候,曾經提到過函數語言程式設計。所謂的函數語言程式設計,也就是說我們可以把函式也看成是變成,進行傳參以及拷貝或者是賦值。

聽起來這個概念好像很黑科技,但實際上它由來很久,在C語言當中就有指向函式的指標,其實也是非常類似的概念。在Python當中最常用的把函式當做引數的例子應該就是lambda函式了。我們經常使用lambda函式來充當各種臨時用途。

arr = [345]
arr = sorted(arr, key=lambda x: -x)

比如在上面的例子當中我們使用lambda函式來定義了排列的方法,這裡的key接受的引數就是一個函式。

除了排序以及其他操作之外,函數語言程式設計還有一個經典的應用就是今天要說的策略模式。其實策略模式的意義非常簡單,和排序是一樣的。就是我們固定下來計算的步驟,但是每個步驟的具體操作細節我們不知道,通過函式傳入。這樣我們傳入不同的函式,就可以執行不同的策略

舉個例子

我們來舉個非常簡單的例子,比如說我們現在有一個商品需要進行售賣。比如說有兩個售賣場景,一個是聚划算一個是雙十一。在這兩個場景當中我們的打折力度是不一樣的,我們可以把不同的折扣看成是不同的銷售策略。

對於售賣來說,除了打折方式不同之外,其他的所有流程都是一樣的。那麼我們完全可以把打折單獨抽象出來用函式來實現,然後再通過傳參的方法傳入即可。

class Order:

    def __init__(self, price, discount_strategy=None):
        self.price = price
        # discount_strategy即使外界傳入的打折方法
        self.discount_strategy = discount_strategy

    def price_after_discount(self):
        if self.discount_strategy:
            discount = self.discount_strategy(self)
        else:
            discount = 0
        return self.price - discount

    def __repr__(self):
        fmt = '<Price: {}, price after discount: {}>'
        return fmt.format(self.price, self.price_after_discount())

我們再來看下實際執行的程式碼:

def ten_percent_discount(order):
    return 0.1 * order.price

def double_eleven_discount(order):
    return 20 + 0.25 * order.price


if __name__ == '__main__':
    print(Order(100))

    print(Order(100, discount_strategy=ten_percent_discount))

    print(Order(1000, discount_strategy=double_eleven_discount))

怎麼樣,是不是非常簡單呢?

其實這裡的主要問題不是程式碼,而是函數語言程式設計的思想。很多人雖然會寫Python,但是之前是寫Java或者是其他靜態型別語言出身,對於Python的一些動態特性沒有很好的瞭解,所以可能意識不到還可以這麼玩。

函數語言程式設計是一個非常好用的東西,也是Python的重要特性,希望大家都能通過這個設計模式學會它、熟悉它。

今天的文章就到這裡,衷心祝願大家每天都有所收穫。如果還喜歡今天的內容的話,請來一個三連支援吧~(點贊、關注、轉發

相關文章