• 设计模式之策略模式
  • 发布于 2个月前
  • 288 热度
    0 评论

策略模式(Strategy Pattern)是一种常用的设计模式,它属于行为型模式。策略模式定义了一系列的算法,并将每个算法封装起来,使它们可以相互替换,而不影响客户端的使用。


在工作中,策略模式可以用于以下场景:

多种算法实现:当需要根据不同的条件或情况选择不同的算法时,可以使用策略模式。例如,根据用户的权限级别选择不同的权限验证算法。
业务规则变化:当业务规则需要经常变化时,可以将每种变化抽象为一个算法,并使用策略模式来动态选择算法。例如,根据市场需求变化选择不同的价格计算策略。
算法的复用和扩展:通过将算法封装成策略类,可以方便地复用和扩展。例如,对于某个数据处理过程,可以定义多种策略来处理不同类型的数据。

减少条件语句:当代码中存在大量的条件语句时,可以将每个条件分支的处理逻辑抽象为一个策略类,从而减少代码的复杂性。例如,根据不同的支付方式选择相应的支付策略。


策略模式的实现通常包含以下角色

策略接口(Strategy Interface):定义了策略类的公共方法。
具体策略类(Concrete Strategy):实现了策略接口,封装了具体的算法实现。
上下文类(Context):持有一个策略接口的引用,并提供一个方法来设置和使用具体的策略。使用策略模式可以使代码更加灵活和可扩展,降低了算法与客户端之间的耦合度,提高了代码的可维护性和可测试性。但是,策略模式也会增加类的数量,增加了代码的复杂性。在使用策略模式时需要根据具体的业务需求和设计原则进行权衡和选择。

下面是一个使用C#实现策略模式的例子:
// 堆代码 duidaima.com
// 定义策略接口
public interface IStrategy
{
    void Execute();
}
// 具体策略类A
public class ConcreteStrategyA : IStrategy
{
    public void Execute()
    {
        Console.WriteLine("使用策略A执行任务");
    }
}
// 具体策略类B
public class ConcreteStrategyB : IStrategy
{
    public void Execute()
    {
        Console.WriteLine("使用策略B执行任务");
    }
}
// 上下文类
public class Context
{
    private IStrategy strategy;
    public Context(IStrategy strategy)
    {
        this.strategy = strategy;
    }
    public void SetStrategy(IStrategy strategy)
    {
        this.strategy = strategy;
    }
    public void ExecuteStrategy()
    {
        strategy.Execute();
    }
}
// 测试代码
public class Program
{
    static void Main(string[] args)
    {
        // 创建具体策略对象
        IStrategy strategyA = new ConcreteStrategyA();
        IStrategy strategyB = new ConcreteStrategyB();
        // 创建上下文对象,并设置策略A
        Context context = new Context(strategyA);
        context.ExecuteStrategy(); // 输出:使用策略A执行任务
        // 修改上下文的策略为策略B,并执行
        context.SetStrategy(strategyB);
        context.ExecuteStrategy(); // 输出:使用策略B执行任务
    }
}
上述例子中,IStrategy是策略接口,定义了策略类的公共方法Execute。ConcreteStrategyA和ConcreteStrategyB是具体的策略类,分别实现了策略接口,并提供了不同的算法实现。Context是上下文类,持有一个策略接口的引用,在执行任务时使用具体的策略。在测试代码中,我们创建了具体的策略对象,并通过上下文对象来设置和执行不同的策略。 运行上述代码,输出结果为:
使用策略A执行任务
使用策略B执行任务
这说明策略模式成功地将不同的算法封装成了独立的策略类,并通过上下文对象来选择和执行不同的策略。
用户评论