大家好,今天給大家介紹一個新的設計模式——策略模式。
策略模式的內容非常簡單,五分鐘就可以學會。嚴格來說,這既可以當做是一種設計模式,也可以當做是一種函數語言程式設計的思想。
函數語言程式設計
我們之前在介紹Python的語言特性的時候,曾經提到過函數語言程式設計。所謂的函數語言程式設計,也就是說我們可以把函式也看成是變成,進行傳參以及拷貝或者是賦值。
聽起來這個概念好像很黑科技,但實際上它由來很久,在C語言當中就有指向函式的指標,其實也是非常類似的概念。在Python當中最常用的把函式當做引數的例子應該就是lambda函式了。我們經常使用lambda函式來充當各種臨時用途。
arr = [3, 4, 5]
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的重要特性,希望大家都能通過這個設計模式學會它、熟悉它。
今天的文章就到這裡,衷心祝願大家每天都有所收穫。如果還喜歡今天的內容的話,請來一個三連支援吧~(點贊、關注、轉發)