首先我们来介绍一下“C# 设计模式系列教程-策略模式”的概念。
策略模式
策略模式是一种行为型设计模式,它允许在运行时选择算法的行为。通过定义多个算法类实现同一个接口,并且可以随时切换算法,使得客户端程序能够根据不同的情况选择不同的算法。
策略模式的角色
策略模式涉及到三个角色:
-
上下文(Context):拥有多个算法类对象,维护一个对于策略对象的引用,可以在运行时切换其所用的算法。
-
抽象策略(Strategy):定义了一个公共的接口,所有的策略都要实现这个接口。
-
具体策略(ConcreteStrategy):实现了抽象策略所定义的接口,提供了一种具体的算法实现。
策略模式的优点
策略模式的优点主要有三个:
- 可以在运行时切换算法。
- 可以避免使用多重条件语句。
- 每个具体策略类都可以单独进行测试和维护,符合单一职责原则。
下面我们来看一下策略模式的两个示例。
示例一:策略模式应用于排序
首先我们来看一个排序的例子,通过策略模式实现不同的排序算法。
我们先定义一个 IStrategy 接口,其中包含一个排序方法 Sort:
public interface IStrategy
{
void Sort(int[] data);
}
然后我们定义 BubbleSort、QuickSort 和 MergeSort 三个具体的策略类,分别实现 IStrategy 接口:
public class BubbleSort : IStrategy
{
public void Sort(int[] data)
{
// 冒泡排序算法
}
}
public class QuickSort : IStrategy
{
public void Sort(int[] data)
{
// 快速排序算法
}
}
public class MergeSort : IStrategy
{
public void Sort(int[] data)
{
// 归并排序算法
}
}
最后我们定义 Context 上下文类,其中包含一个 IStrategy 类型的私有字段,以及一个 SetStrategy 方法和一个 Sort 方法:
public class Context
{
private IStrategy _strategy;
public void SetStrategy(IStrategy strategy)
{
_strategy = strategy;
}
public void Sort(int[] data)
{
_strategy.Sort(data);
}
}
在客户端程序中,我们可以通过 SetStrategy 方法设置具体的排序算法,然后调用 Sort 方法进行排序:
int[] data = new int[] { 1, 3, 2, 4, 6, 5 };
Context context = new Context();
context.SetStrategy(new BubbleSort());
context.Sort(data);
context.SetStrategy(new QuickSort());
context.Sort(data);
context.SetStrategy(new MergeSort());
context.Sort(data);
示例二:策略模式应用于支付
接下来我们来看一个支付的例子,通过策略模式实现不同的支付方式。
首先我们定义一个 IStrategy 接口,其中包含一个支付方法 Pay:
public interface IStrategy
{
void Pay(decimal amount);
}
然后我们定义 Alipay、WechatPay 和 UnionPay 三个具体的策略类,分别实现 IStrategy 接口:
public class Alipay : IStrategy
{
public void Pay(decimal amount)
{
// 支付宝支付
}
}
public class WechatPay : IStrategy
{
public void Pay(decimal amount)
{
// 微信支付
}
}
public class UnionPay : IStrategy
{
public void Pay(decimal amount)
{
// 银联支付
}
}
最后我们定义 Context 上下文类,其中包含一个 IStrategy 类型的私有字段,以及一个 SetStrategy 方法和一个 Pay 方法:
public class Context
{
private IStrategy _strategy;
public void SetStrategy(IStrategy strategy)
{
_strategy = strategy;
}
public void Pay(decimal amount)
{
_strategy.Pay(amount);
}
}
在客户端程序中,我们可以通过 SetStrategy 方法设置具体的支付方式,然后调用 Pay 方法进行支付:
decimal amount = 100m;
Context context = new Context();
context.SetStrategy(new Alipay());
context.Pay(amount);
context.SetStrategy(new WechatPay());
context.Pay(amount);
context.SetStrategy(new UnionPay());
context.Pay(amount);
这样就实现了根据不同的情况选择不同的支付方式。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# 设计模式系列教程-策略模式 - Python技术站