策略模式(Stragety Pattern)
文章目录
- 1.定义
- 2.结构
- 3.代码实现
1.定义
策略模式是一种行为设计模式, 它能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。
2.结构
上下文 (Context)
:维护指向具体策略的引用, 且仅通过策略接口与该对象进行交流策略 (Strategy)
: 接口是所有具体策略的通用接口, 它声明了一个上下文用于执行策略的方法具体策略 (Concrete Strategies)
: 实现了上下文所用算法的各种不同变体客户端 (Client)
: 会创建一个特定策略对象并将其传递给上下文。 上下文则会提供一个设置器以便客户端在运行时替换相关联的策略
3.代码实现
实现一个计算策略:
- 策略类接口(Strategy):
// 计算策略
public interface IConcreteStragety
{
double Execute(double a, double b);
}
- 具体策略类(Concrete Strategies):
// 加法策略
public class ConcreteStrategyAdd : IConcreteStragety
{
public double Execute(double a, double b)
{
return a + b;
}
}
// 减法策略
public class ConcreteStrategySubtract : IConcreteStragety
{
public double Execute(double a, double b)
{
return a - b;
}
}
// 乘法策略
public class ConcreteStrategyMultiply : IConcreteStragety
{
public double Execute(double a, double b)
{
return a * b;
}
}
- 上下文 (Context):
public class StragetyContext
{
private IConcreteStragety stragety;
public StragetyContext(IConcreteStragety stragety)
{
this.stragety = stragety;
}
public void SetTaxStragety(IConcreteStragety stragety)
{
this.stragety = stragety;
}
public double ExecuteStrategy(double a, double b)
{
return stragety.Execute(a, b);
}
}
- 客户端 (Client):
StragetyContext context = new StragetyContext(new ConcreteStrategyAdd());
Console.WriteLine("加法策略:{0}", context.ExecuteStrategy(20, 10));
context.SetTaxStragety(new ConcreteStrategySubtract());
Console.WriteLine("减法策略:{0}", context.ExecuteStrategy(20, 10));
context.SetTaxStragety(new ConcreteStrategyMultiply());
Console.WriteLine("乘法策略:{0}", context.ExecuteStrategy(20, 10));
- 结果
加法策略:30
减法策略:10
乘法策略:200