前言:
最近在学习设计模式,简单工厂是接触的第一个模式,后来,就遇到了策略模式,策略模式真是有谋略啊!定义了算法家族,有了算法家族,再难的计算都不在话下了!!!今天,我们一起来学习策略模式,看看这是一个怎样的设计模式?
中心:
(一)定义
官方:
它定义了算法家族,分别封装起来起来,让他们之间可以相互替代,此模式让算法的变化,不会影响到使用算法的用户。
个人理解:
定义了一系列的算法,将算法封装在独立的策略类中,既然独立,就可以相互替代,所有的算法完成的是相同的工作,只是实现不同,它以相同的方式调用所有的算法。
相比继承的优点:
继承提供了一种支持多种算法或行为的方法,而继承使得算法父类与子类混合,难以理解、维护、和扩展,还不同的动态的改变算法,这是继承的缺点,正是策略模式的优点。使用策略模式,使得易于切换、理解、和扩展。
(二)结构图
UML图:
例子:
以商场打折为例,可用下图来理解策略模式。
(三)主要代码
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. 如果一个对象有很多的行为,
在实践中,只要分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式。
总结:
策略模式,你懂了吗?希望这篇博客,对大家有用!
标签:策略,void,模式,Strategy,算法,context,Context,设计模式 From: https://blog.51cto.com/u_15586641/5763786