設計模式之策略模式的Python實現

2022-03-11 17:17:29 字數 3621 閱讀 9308

1. 策略模式解決的是什麼問題

策略模式解決的應用場景是這樣的: 在業務場景中,需要用到多個演算法,並且每個演算法的引數是需要調整的。那麼當不同的行為堆砌到同乙個類中時,我們很難避免使用條件語句來選擇合適的行為。我們需要解決的是把演算法封裝起來,達到演算法的變化不會影響到使用演算法的客戶的效果。實際上就是把演算法模組給完全獨立出來,並且易於配置、修改和擴充套件,實現「開閉」原則。

通俗來講就是針對乙個問題而定義出乙個解決的模板,這個模板就是具體的策略,每個策略都是按照這個模板來的。這種情況下我們有新的策略時就可以直接按照模板來寫,而不會影響之前已經定義好的策略。只要在分析過程中聽到需要在不同時間應用不同的業務規則,就可以考慮使用策略模式處理這種變化的可能性。

2. 什麼是策略模式

策略模式是一種定義一系列演算法的方法,從概念上來看,所有這些演算法完成的都是相同的工作,只是實現不同,它可以以相同的方式呼叫所有的演算法,減少了各種演算法類與演算法使用類之間的耦合。

策略模式的strategy類層次為context定義了一系列可供重用的演算法或者行為。繼承有助於提取出這些演算法中的公共功能。

策略模式的另乙個優點:簡化了單元測試。每個演算法都有自己的類,是可以做自己的介面單獨測試。

策略模式指對一系列的演算法定義,並將每乙個演算法封裝起來,而且使它們還可以相互替換。策略模式讓演算法獨立於使用它的客戶而獨立變化

3. 策略模式的具體實現

#

!/usr/bin/python3

#-*- coding: utf-8 -*-

class

cashstrategy(object):

def__init__

(self):

pass

defcharge(self):

pass

class

cashnormal(cashstrategy):

defcharge(self,money):

return

money

class

cashrebate(cashstrategy):

def__init__

(self, rebate):

self.rebaterate =rebate

defcharge(self, money):

return money *self.rebaterate

class

cashreturn(cashstrategy):

def__init__

(self, return_standard, return_money):

self.return_standard =return_standard

self.return_money =return_money

defcharge(self, money):

if money >=self.return_standard:

return money -self.return_money

else

:

return

money

class

cashcontext(object):

def__init__(self, charge_type, *charge_parameters):

self.charge_type =charge_type

if charge_type == '

normal':

self.current_strategy =cashnormal()

if charge_type == '

rebate':

self.current_strategy =cashrebate(charge_parameters[0])

if charge_type == '

return':

self.current_strategy = cashreturn(charge_parameters[0],charge_parameters[1])

defcharge_money(self,money):

#print(self.charge_parameters)

return

self.current_strategy.charge(money)

if__name__ == "

__main__":

charge_cash_1 = cashcontext('

rebate

',0.8)

print('

rebate:

',charge_cash_1.charge_money(200))

charge_cash_2 = cashcontext('

normal')

print('

normal:

',charge_cash_2.charge_money(200))

charge_cash_3 = cashcontext('

return

',200,100)

print('

return:

',charge_cash_3.charge_money(200))

rebate: 160.0

normal: 200

return: 100

4. 策略模式與工廠模式的異同

相同點:

實際上,我們發現策略模式和工廠模式是很像的。本質實現上都是子類覆蓋父類,利用了語言的繼承特性

工廠模式中,每個要實現的,可以對應到策略模式中每個具體的strategy

而工廠模式中的factory,又可以對應到策略模式中的context類。因為都在裡面進行了對不同情況的處理(判斷要實現哪個類,判斷要採取哪種策略)

不同點:

用途不一樣

工廠是建立型模式,它的作用就是建立物件;

策略是行為型模式,它的作用是讓乙個物件在許多行為中選擇一種行為;

關注點不一樣

乙個關注物件建立

乙個關注行為的封裝

簡單工廠模式只是解決了物件的建立問題,工廠需要包括所有的產品物件的建立,如果產品物件形式經常變化,就需要經常改動工廠,以致**重新編譯。所以策略模式就誕生了,策略模式---它定義了演算法家族,分別封裝起來,而不是像簡單產品模式一樣定義所有的產品類讓他們之間可以互相替換,此模式讓演算法的變化,不會影響到使用演算法的客戶,使客戶擁有相同的訪問過程。

所以我認為除了概念上的側重點不同(用途,關注點),兩者最明顯的差異就是:策略模式中,不同的模式之間可以相互替換,不會影響到使用演算法的客戶。而工廠模式中,各個類不能相互替換。

1. 《大話設計模式》

2.  工廠模式與策略模式之區別 

設計模式之策略模式

include using namespace std 飛行行為介面類 class flystrategy 高空飛行行為具現類 class heightfly public flystrategy virtual void fly private heightfly 低空飛行行為具現類 class ...

設計模式之 策略模式

策略模式 strategy pattern 定義了演算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化,不會影響到使用演算法的客戶。策略模式是一種定義了一系列演算法的方法,從概念上來看,所以得這些演算法完成的都是相同的工作,只是實現不同,它可以以相同的方式呼叫所有的演算法,減少了各...

設計模式之策略模式

何為策略,就是可以實現目標的方案集合。而完成一項任務有不同的方式,每一種方式稱為乙個策略。策略模式就是定義一系列演算法,將每乙個演算法封裝起來,並讓他們可以相互替換。很簡單的乙個例子 年底移動公司推出很多的活動,比如說 存話費贈食用油,交話費贈話費,買手機贈話費 等等。推出這些個活動目的就只有乙個,...