一、策略模式的特点
在策略模式中我们定义一个基类Strategy作为公共的接口类,然后在下方不同的类通过继承实现同一个接口,实现不同的功能,这样做到在客户端可以调用统一个接口,根据不同的需求实现不同的功能。而Contex作为一个调配类根据客户指定的功能,调用实现这个功能的接口。
策略模式作用就是将实现功能的算法进行单独的封装,使用时可以相互替代其他的算法。
策略模式的优点:
1、可以在自己定义的算法之间自由的切换出来问题
2、易于扩展出来其他问题的算法
3、容易对每个算法进行修改由不会影响其他的算法对象。
二、策略模式的实现
1、策略模式的实现模型
2、策略模式的代码实现
abstract class Strategy
{
public abstract void AlgorithmInterface();
}
class ConcretesStrategyA : Strategy
{
public override void AlgorithmInterface()
{
Console.WriteLine("实现了算法A");
}
}
class ConcretesStrategyB : Strategy
{
public override void AlgorithmInterface()
{
Console.WriteLine("实现了算法B");
}
}
class ConcretesStrategyC : Strategy
{
public override void AlgorithmInterface()
{
Console.WriteLine("实现了算法C");
}
}
class Context
{
Strategy strategy;
public Context(Strategy strategy)
{
this.strategy = strategy;
}
public void ContextInterface()
{
strategy.AlgorithmInterface();
}
}
class wMain
{
static void Main()
{
Context context;
context = new Context(new ConcretesStrategyA());
context.ContextInterface();
context = new Context(new ConcretesStrategyB());
context.ContextInterface();
context = new Context(new ConcretesStrategyC());
context.ContextInterface();
Console.Read();
}
}
运行结果:
三、策略模式与工厂模式的结合
使用策略模式的时候还是需要由客户端指定创建那个对象,然后传递给策略模式,这样本身没有解决客户的判断压力,我们可以通过与工厂模式的结合来减轻客户的判断压力。客户端只需要知道需要实现那种功能,只需要将这种功能通知给策略适配器,而不必判断使用那个对象。
代码实现
using System;
abstract class Strategy
{
public abstract void AlgorithmInterface();
}
class ConcretesStrategyA : Strategy
{
public override void AlgorithmInterface()
{
Console.WriteLine("实现了算法A");
}
}
class ConcretesStrategyB : Strategy
{
public override void AlgorithmInterface()
{
Console.WriteLine("实现了算法B");
}
}
class ConcretesStrategyC : Strategy
{
public override void AlgorithmInterface()
{
Console.WriteLine("实现了算法C");
}
}
//改良的Contex
class ContextTool
{
public Strategy strategy = null;
public ContextTool(string type)
{
switch (type)
{
case "A":
strategy = new ConcretesStrategyA();
break;
case "B":
strategy = new ConcretesStrategyB();
break;
case "C":
strategy = new ConcretesStrategyC();
break;
default:break;
}
}
public void ContextInterface()
{
strategy.AlgorithmInterface();
}
}
class wMain
{
static void Main()
{
ContextTool tools;
tools = new ContextTool("A");
tools.ContextInterface();
tools = new ContextTool("B");
tools.ContextInterface();
tools = new ContextTool("C");
tools.ContextInterface();
Console.Read();
}
}
运行结果 :