前言:


最近在学习设计模式,简单工厂是接触的第一个模式,后来,就遇到了策略模式,策略模式真是有谋略啊!定义了算法家族,有了算法家族,再难的计算都不在话下了!!!今天,我们一起来学习策略模式,看看这是一个怎样的设计模式?


中心:

(一)定义

官方:


它定义了算法家族,分别封装起来起来,让他们之间可以相互替代,此模式让算法的变化,不会影响到使用算法的用户。


个人理解:


定义了一系列的算法,将算法封装在独立的策略类中,既然独立,就可以相互替代,所有的算法完成的是相同的工作,只是实现不同,它以相同的方式调用所有的算法。


相比继承的优点:


继承提供了一种支持多种算法或行为的方法,而继承使得算法父类与子类混合,难以理解、维护、和扩展,还不同的动态的改变算法,这是继承的缺点,正是策略模式的优点。使用策略模式,使得易于切换、理解、和扩展。


(二)结构图

UML图:


【设计模式之策略模式】_总结


例子:

以商场打折为例,可用下图来理解策略模式。


【设计模式之策略模式】_ide_02


(三)主要代码


Strategy类,定义所有支持的算法的公共接口


<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">//抽象算法类
abstract class Strategy
{
//算法方法
public abstract void AlgorithmInterface();
}</span></span></span>

ConcreteStrategy,封装了具体的算法或行为,继承于Strategy

<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"> //具体算法A
class ConcreteStrategyA:Strategy
{
//算法A实现方法
public override void AlgorithmInterface()
{
Console.WriteLine("算法A实现");
}
}
//具体算法B
class ConcreteStrategyB : Strategy
{
//算法b实现方法
public override void AlgorithmInterface()
{
Console.WriteLine("算法B实现");
}
}
//具体算法C
class ConcreteStrategyC : Strategy
{
//算法A实现方法
public override void AlgorithmInterface()
{
Console.WriteLine("算法C实现");
}
}</span></span></span>

Context,用一个ConcreteStrategy来配置,维护一个对Strategy对象的引用

<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"> //上下文
class Context
{
Strategy strategy;
public Context (Strategy strategy)
{
this.strategy = strategy;
}
//上下文接口
public void ContextInterface()
{
strategy.AlgorithmInterface();
}
}</span></span></span>

客户端代码

<span style="font-size:18px;"><span style="font-size:18px;"> <span style="font-size:18px;">static void Main(string[] args)
{
Context context;
context = new Context(new ConcreteStrategyA());
context.ContextInterface();

context = new Context(new ConcreteStrategyB());
context.ContextInterface();

context = new Context(new ConcreteStrategyC());
context.ContextInterface();

Console.Read();
}</span></span></span>




(四)定位


策略模式,从字面可以理解“出谋划策”,是一种行为,故属于行为型模式。


(五)优缺点


优点:减少耦合,简化测试(单元测试)


缺点:客户端知道所有的类,任务重, 造成很多策略类


(六)何时用


1. 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为

2. 一个系统的算法使用的数据不可以让客户端知道。

3. 如果一个对象有很多的行为,




在实践中,只要分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式。


总结:


策略模式,你懂了吗?希望这篇博客,对大家有用!