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

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

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

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

2. 什麼是策略模式單元測試

策略模式是一種定義一系列算法的方法,從概念上來看,全部這些算法完成的都是相同的工做,只是實現不一樣,它能夠以相同的方式調用全部的算法,減小了各類算法類與算法使用類之間的耦合。測試

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

策略模式的另外一個優勢:簡化了單元測試。每一個算法都有本身的類,是能夠作本身的接口單獨測試。.net

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

3. 策略模式的具體實現code

#!/usr/bin/python3
# -*- coding: utf-8 -*-

class CashStrategy(object):
    def __init__(self):
        pass
    
    def charge(self):
        pass

class CashNormal(CashStrategy):
    def charge(self,money):
        return money
        
class CashRebate(CashStrategy):
    def __init__(self, rebate):
        self.rebaterate = rebate
        
    def charge(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
        
    def charge(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])
    
    def charge_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: 100orm

 

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

相同點:

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

工廠模式中,每一個要實現的,能夠對應到策略模式中每一個具體的Strategy

而工廠模式中的Factory,又能夠對應到策略模式中的Context類。由於都在裏面進行了對不一樣狀況的處理(判斷要實現哪一個類,判斷要採起哪一種策略)

不一樣點:

用途不同
工廠是建立型模式,它的做用就是建立對象;
策略是行爲型模式,它的做用是讓一個對象在許多行爲中選擇一種行爲;

關注點不同
一個關注對象建立
一個關注行爲的封裝

簡單工廠模式只是解決了對象的建立問題,工廠須要包括全部的產品對象的建立,若是產品對象形式常常變化,就須要常常改動工廠,以至代碼從新編譯。因此策略模式就誕生了,策略模式---它定義了算法家族,分別封裝起來,而不是像簡單產品模式同樣定義全部的產品類讓他們之間能夠互相替換,此模式讓算法的變化,不會影響到使用算法的客戶,使客戶擁有相同的訪問過程。

因此我認爲除了概念上的側重點不一樣(用途,關注點),二者最明顯的差別就是:策略模式中,不一樣的模式之間能夠相互替換,不會影響到使用算法的客戶。而工廠模式中,各個類不能相互替換。

 

參考連接:

1. 《大話設計模式》

2.  工廠模式與策略模式之區別 https://blog.csdn.net/gaibian0823/article/details/27842443

相關文章
相關標籤/搜索