策略模式(strategy pattern):它定義了演算法家族,分別封裝起來,讓他們之間可以相互替換,此模式讓演算法的變化,不會影響到使用演算法的客戶.
下面是乙個商場活動的實現
1這幾個類的設計如下圖:#!/usr/bin/env python2#
-*- coding:utf-8 -*-34
__author__ = '
andy'5
'''6
大話設計模式
7設計模式——策略模式
8策略模式(strategy):它定義了演算法家族,分別封裝起來,讓他們之間可以相互替換,此模式讓演算法的變化,不會影響到使用演算法的客戶
9'''
1011
#現金收費抽象類
12class
cashsuper(object):
1314
defaccept_cash(self,money):
15pass16#
正常收費子類
17class
cashnormal(cashsuper):
1819
defaccept_cash(self,money):
20return
money
2122
#打折收費子類
23class
cashrebate(cashsuper):
2425
def__init__(self,discount=1):
26 self.discount =discount
2728
defaccept_cash(self,money):
29return money *self.discount
3031
#返利收費子類
32class
cashreturn(cashsuper):
3334
def__init__(self,money_condition=0,money_return=0):
35 self.money_condition =money_condition
36 self.money_return =money_return
3738
defaccept_cash(self,money):
39if money>=self.money_condition:
40return money - (money / self.money_condition) *self.money_return
41return
money
4243
#具體策略類
44class
context(object):
4546
def__init__
(self,csuper):
47 self.csuper =csuper
4849
defgetresult(self,money):
50return
self.csuper.accept_cash(money)
5152
5354
55if
__name__ == '
__main__':
56 money = input("
原價: ")
57 strategy ={}
58 strategy[1] =context(cashnormal())
59 strategy[2] = context(cashrebate(0.8))
60 strategy[3] = context(cashreturn(100,10))
61 mode = input("
選擇折扣方式: 1) 原價 2) 8折 3) 滿100減10: ")
62if mode in
strategy:
63 csuper =strategy[mode]
64else:65
"不存在的折扣方式
"66 csuper = strategy[1]
67print
"需要支付:
",csuper.getresult(money)
使用乙個策略類cashsuper定義需要的演算法的公共介面,定義三個具體策略類:cashnormal,cashrebate,cashreturn,繼承於cashsuper,定義乙個上下文管理類,接收乙個策略,並根據該策略得出結論,當需要更改策略時,只需要在例項的時候傳入不同的策略就可以,免去了修改類的麻煩
出處:
《大話設計模式》python實現 簡單工廠模式
基於python3.6實現 最近開始看 大話設計模式 由於平常用python,所以把 改寫了一下,也是心血來潮,不知道能不能更下去,慢慢來吧。簡單工廠模式 class operation object pass class opadd operation def getresult self ret...
大話設計模式Python實現 介面卡模式
介面卡模式 adapter pattern 將乙個類的介面轉換成為客戶希望的另外乙個介面.下面是乙個介面卡模式的demo 1 usr bin env python2 coding utf 8 34 author andy 5 6 大話設計模式 7設計模式 介面卡模式 8介面卡模式 adapter p...
大話設計模式策略模式c 實現
其他二十三種設計模式 include using namespace std 策略模式 strategy 定義演算法家族,分別封裝起來,讓演算法之間可以相互替換,且不會影響到使用演算法的client客戶 抽象收費策略 class cashsuper 正常收費類 class cashnormal pu...