策略模式(Strategy Pattern)是一种常用的设计模式,它属于行为型模式。策略模式定义了一系列的算法,并将每个算法封装起来,使它们可以相互替换,而不影响客户端的使用。
在工作中,策略模式可以用于以下场景:
多种算法实现:当需要根据不同的条件或情况选择不同的算法时,可以使用策略模式。例如,根据用户的权限级别选择不同的权限验证算法。减少条件语句:当代码中存在大量的条件语句时,可以将每个条件分支的处理逻辑抽象为一个策略类,从而减少代码的复杂性。例如,根据不同的支付方式选择相应的支付策略。
策略模式的实现通常包含以下角色:
策略接口(Strategy Interface):定义了策略类的公共方法。// 堆代码 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执行任务这说明策略模式成功地将不同的算法封装成了独立的策略类,并通过上下文对象来选择和执行不同的策略。