面對演算法時常變動
"""
策略模式
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 乙個系統需要動態地在幾種演算法中選擇一種。...