python微服务架构设计模式_架构师修炼之设计模式 - 策略模式(Strategy) 【Python与C#实现】...

本文详细介绍了策略模式的概念、分类、结构及其实现方式,并通过Python和C#提供了具体实例。此外,还探讨了策略模式的优点、缺点及其适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

程序员,我为你祝福

愿你有一个灿烂的前程

愿你有情人终成眷属

愿你在尘世获得幸福

我只想成为架构师,走遍江湖!

目录

模式定义

模式分类

模式结构

实例(C#与Python版)

优点

缺点

使用场景

模式定义

它定义一系列算法,将每一个算法封装起来,并让它们之间可以相互替换。此模式让算法的变化,不会影响到使用算法的客户,也称为政策模式(Policy)。

模式分类

属于行为型模式。

模式结构

主要成员:

Context:上下文类。用一个具体ConcreteStrategy策略来配置,维护一个对Strategy对象的引用;

Strategy:抽象策略类。定义算法公共接口;

ConcreteStrategy:具体策略类。继承于Strategy,封装具体的算法或者行为。

6a50521e7018a70220b177cc95767de7.png

实例

Python版本:

Strategy.py

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

from abc importABC, abstractmethodclassStrategy(ABC):"""抽象类"""

def __init__(self):"""构造函数"""@abstractmethoddefalgorithmInterface(self):"""抽象方法"""

View Code

ConcreteStrategy.py

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

from Strategy importStrategyclassConcreteStrategyA(Strategy):def __init__(self):

super().__init__()defalgorithmInterface(self):print("算法A实现")classConcreteStrategyB(Strategy):def __init__(self):

super().__init__()defalgorithmInterface(self):print("算法B实现")

View Code

Context.py

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

from Strategy importStrategyclassContext():def __init__(self):"""构造函数"""

defsetStrategy(self, strategy):"""设置算法"""self._strategy=strategydefcontextInterface(self):"""执行算法"""self._strategy.algorithmInterface()

View Code

Client.py

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

from Context importContextfrom ConcreteStrategy importConcreteStrategyA, ConcreteStrategyB

context=Context()

context.setStrategy(ConcreteStrategyA())

context.contextInterface()

context.setStrategy(ConcreteStrategyB())

context.contextInterface()

View Code

执行结果:

8ba15bac69f85aa1eb07a85ca431c83a.png

C#版本:

Strategy.cs

usingSystem;namespaceStrategy

{public abstract classStrategy

{public abstract voidAlgorithmInterface();

}

}

ConcreteStrategyA.cs

usingSystem;namespaceStrategy

{public classConcreteStrategyA : Strategy

{public override voidAlgorithmInterface()

{

Console.WriteLine("算法A实现");

}

}

}

ConcreteStrategyB.cs

usingSystem;namespaceStrategy

{public classConcreteStrategyB : Strategy

{public override voidAlgorithmInterface()

{

Console.WriteLine("算法B实现");

}

}

}

Context.cs

usingSystem;namespaceStrategy

{public classContext

{privateStrategy _strategy;publicContext()

{ }public voidSetStrategy(Strategy strategy)

{

_strategy=strategy;

}public voidContextInterface()

{

_strategy.AlgorithmInterface();

}

}

}

Client.cs

usingSystem;namespaceStrategy

{public classClient

{public static void Main(string[] args)

{var context = newContext();

context.SetStrategy(newConcreteStrategyA());

context.ContextInterface();

context.SetStrategy(newConcreteStrategyB());

context.ContextInterface();

Console.Read();

}

}

}

优点

将算法封装到一个个独立的Strategy子类,可以在使用算法时消除条件判断语句。

由于每个算法是独立的,方便单元测试。

由于抽象类Strategy定义了一系列算法或行为的接口,通过继承它可以灵活快速的添加新算法或行为。

算法或行为的调用通过Context上下文处理,方便管理。

缺点

客户端必须知道所有的策略类,并自行决定使用哪一个策略类。

使用场景

以下情况可以使用策略模式:

如果系统中某个类的某一行为存在多种实现方式,而且这些实现方式可以互换时;(比如C#的泛型)

一个系统需要动态地在几种算法中选择一种时;(比如商场打折系统)

如果一个对象有很多的行为,这些行为使用多重的条件选择语句时;

如果需要对算法数据结构进行保密时;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值