大家好,今天給大家介紹一個新的設計模式——策略模式。
策略模式的內容非常簡單,五分鍾就可以學會。嚴格來說,這既可以當做是一種設計模式,也可以當做是一種函數式編程的思想。
函數式編程
我們之前在介紹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的重要特性,希望大家都能通過這個設計模式學會它、熟悉它。
今天的文章就到這里,衷心祝願大家每天都有所收獲。如果還喜歡今天的內容的話,請來一個三連支持吧~(點贊、關注、轉發)