設計模式python實現 02 策略模式

2022-07-31 18:21:15 字數 1943 閱讀 1680

面對演算法時常變動

"""

策略模式

author: panky

"""import abc

class cashsuper(metaclass=abc.abcmeta):

"""現金收費抽象類"""

@abc.abstractmethod

def accept_cash(self, money):

pass

class cashnormal(cashsuper):

"""正常收費子類"""

def accept_cash(self, money):

return money

class cashrebate(cashsuper):

"""打折收費子類"""

def __init__(self, discount=1.0):

self.discount = discount

def accept_cash(self, money):

return money * self.discount

class cashreturn(cashsuper):

"""返利收費子類"""

def __init__(self, money_condition=0, money_return=0):

self.money_condition = money_condition

self.money_return = money_return

def accept_cash(self, money):

if money >= self.money_condition:

return money - (money / self.money_condition) * self.money_return

return money

class context(object):

"""具體策略類"""

def __init__(self, cash_class_obj):

self.cash_class_obj = cash_class_obj

def get_result(self, money):

return self.cash_class_obj.accept_cash(money)

if __name__ == "__main__":

input_money = input("原價:")

strategy = dict()

strategy[1] = context(cashnormal())

strategy[2] = context(cashrebate(0.8))

strategy[3] = context(cashreturn(100, 10))

mode = input("選擇折扣方式: 1)原價 2)8折 3)滿100減10:")

if int(mode) in strategy:

c_super = strategy[int(mode)]

else:

print("不存在的折扣方式")

使用乙個策略類cashsuper定義需要的演算法的公共介面,定義三個具體策略類:cashnormal,cashrebate,cashreturn,繼承於cashsuper,定義乙個上下文管理類,接收乙個策略,並根據該策略得出結論,當需要更改策略時,只需要在例項的時候傳入不同的策略就可以,免去了修改類的麻煩

設計模式02 模板設計模式

需求 獲取一段程式執行的時間。原理 獲取程式開始和結束的時間並相減即可。當 完成優化後,就可以解決這類問題。這種方式,模版方法設計模式。什麼是模版方法呢?在定義功能時,功能的一部分是確定的,但是有一部分是不確定,而確定的部分在使用不確定的部分,那麼這時就將不確定的部分暴露出去。由該類的子類去完成。a...

python實現模式 python 設計模式實現

參見 1 工廠模式,關鍵字 介面 繼承 關聯 以私有實現 組合 比如雁群和雁的關係 依賴關係 適用於不經常向工廠方法中新增類的情況 2 工廠方法模式 參見 工廠方法相比工程模式會比較複雜,因為會涉及多個工廠類,並且不能改變事實 客戶端仍需要修改 3 策略模式 定義了不同的方式 區別 1 工廠模式 v...

設計模式02 策略模式

場景1 人旅行,set不同的策略實現類,採用對應實現類裡的旅行策略辦法 eg 飛機策略實現類裡的策略方法,乘坐飛機旅行 場景21 如果在乙個系統裡面有許多類,它們之間的區別僅在於它們的行為,那麼使用策略模式可以動態地讓乙個物件在許多行 為中選擇一種行為。2 乙個系統需要動態地在幾種演算法中選擇一種。...