前言
策略模式应对业务处理中,会有多种相似处理方式(算法),然后封装成算法+抽象,此外,调用环节也有扩展要求的,需要context(上下文)
好处:算法封装,有抽象可以扩展;调用环节转移,可以扩展;
缺陷:上端必须知道全部算法,而且知道映射关系
包一层:没有什么技术问题是包一层不能解决的,如果有,再包一层
中间层,转移调用,核心意义就在于调用环节可以扩展
策略模式包含以下几个核心角色
- 环境(Context):维护一个对策略对象的引用,负责将客户端请求委派给具体的策略对象执行。环境类可以通过依赖注入、简单工厂等方式来获取具体策略对象。
- 抽象策略(Abstract Strategy):定义了策略对象的公共接口或抽象类,规定了具体策略类必须实现的方法。
- 具体策略(Concrete Strategy):实现了抽象策略定义的接口或抽象类,包含了具体的算法实现。
策略模式通过将算法与使用算法的代码解耦,提供了一种动态选择不同算法的方法。客户端代码不需要知道具体的算法细节,而是通过调用环境类来使用所选择的策略。
使用场景
在需要根据不同情况采取不同算法或策略时使用较多,例如支付方式选择、排序算法、保存为不同文件、计算器运算等。
使用接口方法实现策略模式(推荐)
使用例子:保存不同类型文件
1、定义接口,有个方法 Save
2、定义三个类(保存不同的文件)比如.pdf
、.txt
。实现接口的方法Save
3、定义一个Context类,两个方法。1.调用抽象类的实现子类 2.调用Save方法
4、实例化Context类,调用他的两个方法。
完整代码实现
//使用接口方法实现策略模式
public class Strategy_interface
{
public interface IStrategy
{
void Save();
}
//策略类 PDF
public class ConvertPDF : IStrategy
{
public void Save()
{
Console.WriteLine("已被转换为PDF!");
}
}
//策略类 TXT
public class ConvertTXT : IStrategy
{
public void Save()
{
Console.WriteLine("已被转换为TXT!");
}
}
//上下文环境
public class DataContext
{
private IStrategy strategy = null;
public void SetStartegy(IStrategy strategy)
{
this.strategy = strategy;
}
public void ExecuteSave()
{
strategy.Save();
}
}
static void Main()
{
DataContext dataContext = new DataContext();
dataContext.SetStartegy(new ConvertPDF());
dataContext.ExecuteSave();
dataContext.SetStartegy(new ConvertTXT());
dataContext.ExecuteSave();
Console.ReadKey();
}
`}
`
使用委托实现策略模式
可以使用Fun<>或者Action<>,也可以使用自定义委托。根据项目需求自定义。
下述代码实现Fun<>传入一个参数去实现,在实际使用过程中,传递参数的需求是常见形式。
完整代码实现
//使用Fun<> 或 Action<> 委托
public class Strategy_delegate
{
//int,int参数,最后一个为out 属于int类型
private Func<int, int, int> _strategy;
public void SetStrategy(Func<int, int, int> strategy) { _strategy = strategy; }
public int Execute(int x,int y)
{
return _strategy(x,y);
}
static void Main()
{
Strategy_delegate _Delegate = new Strategy_delegate();
//加法策略
_Delegate.SetStrategy((x, y) => x + y);
Console.WriteLine("加法运算,值为:" + _Delegate.Execute(1, 5));
//减法策略
_Delegate.SetStrategy((x, y) => x - y);
Console.WriteLine("减法运算,值为:" + _Delegate.Execute(7, 5));
Console.ReadKey();
}
`}
`
拓展:在创建不同的策略对象的时候,可以使用简单工厂 + 反射 + 配置文件的方式创建
文章拓展资料
- C#文章集合:更全面的C#知识点文章
- 【设计模式】C# 实现行为型模式之 -- 观察者模式:常用的观察者模式实现
- 【设计模式】C# 实现结构型模式之 -- 适配器模式:结构型模式 ------ 适配器模式
- 【设计模式】C#实现创建型模式之-简单工厂、工厂方法、抽象工厂模式:创建型模式-工厂模式