行为型设计模式-策略模式
一个不正经的程序员,学的不正经的设计模式,写的不正经的博客,做的不正经的分享系列。
(不定期更新设计模式分享第一篇章)
文章目录
一、概念 Strategy [ˈstrætədʒi] :策略;计策;行动计划;策划;规划;部署;统筹安排;战略;战略部署
1.What
定义一系列算法, 将算法类进行封装, 以使算法的对象能够相互替换,而不互相影响。
2.Why
解决if-else或switch带来的算法臃肿问题,不能代替if-else或switch
3.Where
a. 针对同一操作的多种处理方式
b. 需要自由切换算法
c. 屏蔽算法执行规则的场景
4.How
三种角色
上下文(Context)控制策略上下文环境,隔离客户端与策略类的耦合关系
抽象策略(IStrategy):定义策略和算法的行为
具体策略(StrategyCaseA,StrategyCaseB….):具体执行算法及函数
示例:基于策略模式实现计算器,实现二维运算
二、基于策略模式实现计算器
1.定义算法抽象接口
代码如下(示例):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Strategy.Demo
{
public interface IStrategy
{
/// <summary>
/// 计算
/// </summary>
/// <param name="num1"></param>
/// <param name="num2"></param>
/// <returns></returns>
int DoCalculationa(int num1, int num2);
}
}
2.策略算法实现类
代码如下(示例):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Strategy.Demo
{
/// <summary>
/// 策略算法实现类
/// </summary>
public class CaseSum : IStrategy
{
public int DoCalculationa(int num1, int num2)
{
return num1 + num2;
}
}
/// <summary>
/// 策略算法实现类
/// </summary>
public class CaseSubtraction : IStrategy
{
public int DoCalculationa(int num1, int num2)
{
return num1 - num2;
}
}
/// <summary>
/// 策略算法实现类
/// </summary>
public class Casemultiplication : IStrategy
{
public int DoCalculationa(int num1, int num2)
{
return num1 * num2;
}
}
/// <summary>
/// 策略算法实现类
/// </summary>
public class Casedivision : IStrategy
{
public int DoCalculationa(int num1, int num2)
{
return num1 / num2;
}
}
/// <summary>
/// 策略算法实现类
/// </summary>
public class Casesurplus : IStrategy
{
public int DoCalculationa(int num1, int num2)
{
return num1 % num2;
}
}
}
3.策略调度器
代码如下(示例):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Strategy.Demo
{
/// <summary>
/// 策略调度器
/// </summary>
public class StrategyContext
{
private IStrategy strategy { get; set; }
public void calculation(int num1, int num2, char calculation)
{
switch (calculation)
{
case '+':
strategy = new CaseSum();
break;
case '-':
strategy = new CaseSubtraction();
break;
case '*':
strategy = new Casemultiplication();
break;
case '/':
strategy = new Casedivision();
break;
case '%':
strategy = new Casesurplus();
break;
}
var result = strategy.DoCalculationa(num1, num2);
Console.WriteLine($"计算结果是:{num1}{calculation}{num2}={result}");
}
}
}
3.Client应用
代码如下(示例):
var cal = new StrategyContext();
cal.calculation(9, 4, '+');
cal.calculation(9, 4, '-');
cal.calculation(9, 4, '*');
cal.calculation(9, 4, '/');
cal.calculation(9, 4, '%');
总结
策略模式应用比较广泛,并且之前总是在不经意间会使用到,但应用的并不是特别规范,使用策略模式可以有效的改善代码环境,减少判断体代码的臃肿,使代码易于维护。