日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

Python設(shè)計(jì)模式中的行為型策略模式_python

作者:范桂颶 ? 更新時(shí)間: 2022-04-20 編程語(yǔ)言

一、策略模式

策略模式中,首先定義了一系列不同的算法,并把它們一一封裝起來(lái),然后在策略類(lèi)中,使這些算法可以相互替換。這意味著,讓一個(gè)類(lèi)的行為(算法)可以在類(lèi)的實(shí)例化對(duì)象運(yùn)行時(shí)進(jìn)行更改。

優(yōu)點(diǎn):

  • 定義了一系列可重用的算法和行為。
  • 消除了一些條件語(yǔ)句。
  • 可以提供相同行為的不同實(shí)現(xiàn)。

缺點(diǎn):

  • Client 必須了解不同的策略行為細(xì)節(jié)。

二、應(yīng)用場(chǎng)景

根據(jù)不同的客戶(hù)屬性,采用不同的折扣策略來(lái)計(jì)算訂單中的商品價(jià)格:

  • 有 1000 或以上積分的客戶(hù),每個(gè)訂單享 5% 折扣。
  • 同一訂單中,單個(gè)商品的數(shù)量達(dá)到 20 個(gè)或以上,享 10% 折扣。
  • 訂單中的不同商品達(dá)到 10 個(gè)或以上,享 7% 折扣。

三、代碼示例

實(shí)體角色:

  • 上下文(Context):集成了算法的類(lèi)。
  • 抽象策略(Strategy):實(shí)現(xiàn)不同算法的組件的共同接口。
  • 具體策略(Concrete Strategy):抽象策略的具體子類(lèi)。
import abc

# 抽象策略
class Strategy(metaclass=abc.ABCMeta):
? ? @abc.abstractmethod
? ? def execute(self, data):
? ? ? ? pass

# 具體策略 1
class Strategy1(Strategy):
? ? def execute(self, data):
? ? ? ? print(f"使用策略1執(zhí)行{data}")

# 具體策略2?
class Strategy2(Strategy):
? ? def execute(self, data):
? ? ? ? print(f"使用策略2執(zhí)行{data}")

# 上下文
class Context:
? ? def __init__(self, data):
? ? ? ? self.strategy = None
? ? ? ? self.data = data

? ? def set_strategy(self, strategy):
? ? ? ? self.strategy = strategy

? ? def do_strategy(self):
? ? ? ? if self.strategy:
? ? ? ? ? ? self.strategy.execute(self.data)
? ? ? ? else:
? ? ? ? ? ? print("請(qǐng)先配置策略!")


if __name__ == "__main__":
? ? data = "測(cè)試數(shù)據(jù)"
? ? s1 = Strategy1()
? ? s2 = Strategy2()
? ? context = Context(data)
? ? context.set_strategy(s1)
? ? context.do_strategy()
? ? context.set_strategy(s2)
? ? context.do_strategy()

原文鏈接:https://is-cloud.blog.csdn.net/article/details/122929628

欄目分類(lèi)
最近更新