策略模式
策略模式 (Strategy Pattern)
策略模式是一种行为设计模式,它允许在运行时选择算法的实现。它通过将算法封装在独立的类中,使得算法可以互相替换,避免了使用条件语句的需求。
介绍
策略模式定义了一系列算法,并将每个算法封装起来,使得它们可以相互替换。策略模式使得算法可以独立于使用它们的客户端变化。
UML 类图
+------------------------------+
| Context |
|------------------------------|
| - strategy:Strategy |
| + SetStrategy(Strategy):void |
| + ExecuteStrategy():void |
+------------------------------+
|
|
v
+---------------------+
| Strategy |
|---------------------|
| + Execute():void |
+---------------------+
|
|
+---------+----------+
| |
v v
+---------------------+ +---------------------+
| ConcreteStrategyA | | ConcreteStrategyB |
|---------------------| |---------------------|
| + Execute():void | | + Execute():void |
+---------------------+ +---------------------+
示例代码
策略接口
// IStrategy.cs
public interface IStrategy
{
void Execute();
}
具体策略
// ConcreteStrategyA.cs
public class ConcreteStrategyA : IStrategy
{
public void Execute()
{
Console.WriteLine("执行策略 A");
}
}
// ConcreteStrategyB.cs
public class ConcreteStrategyB : IStrategy
{
public void Execute()
{
Console.WriteLine("执行策略 B");
}
}
上下文类
// Context.cs
public class Context
{
private IStrategy _strategy;
public void SetStrategy(IStrategy strategy)
{
_strategy = strategy;
}
public void ExecuteStrategy()
{
_strategy.Execute();
}
}
客户端代码
// Program.cs
using System;
class Program
{
static void Main()
{
Context context = new Context();
// 使用策略 A
context.SetStrategy(new ConcreteStrategyA());
context.ExecuteStrategy();
// 切换到策略 B
context.SetStrategy(new ConcreteStrategyB());
context.ExecuteStrategy();
}
}
总结
策略模式通过将算法封装在独立的类中,消除了条件语句的使用,使得算法可以独立于使用它们的客户端变化。这种模式提供了一种灵活的设计方式,使得程序更容易扩展和维护。