一、环境及问题
二、策略模式(Strategy Pattern)
- 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用经的客户而独立变化
三、代码实现
- 定义抽象策略类
interface IStrategy
{
void fihting();
}
- 实现具体策略类
class Bow:IStategy{
public void fighting()
{
Console.WriteLine("向敌人放冷箭中。。。");
}
}
class Knife:IStategy{
public void fighting()
{
Console.WriteLine("把敌人千刀万剐中。。。");
}
}
class Cannon:IStategy{
public void fighting()
{
Console.WriteLine("加农炮轰击敌人中。。。");
}
}
- 定义环境类
class Context
{
private IStrategy _strategy;
public Context(IStrategy s)
{
this._strategy=s;
}
public void fighting()
{
this._strategr.fighting();
}
}
- 主函数
class Program
{
static void Main(string[] args)
{
Context context;
context=new Context(new Knife());
Console.WriteLine("选择武器为刀:");
context.fighting();
Console.WriteLine();
context=new Context(new Bow());
Console.WriteLine("选择武器为弓:");
context.fighting();
Console.WriteLine();
context=new Context(new Cannon());
Console.WriteLine("选择武器为加农炮:");
context.fighting();
Console.WriteLine();
}
}
四、扩展说明
- 策略模式的优点
- 策略模式提供了对“开闭原则”的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为。
- 策略模式提供了管理相关的算法族的办法。
- 策略模式提供了可以替换继承关系的办法。
- 使用策略模式可以避免使用多重条件转移语句
- 策略模式的缺点
- 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
- 策略模式将造成产生很多策略类
五、小结 策略模式使用环境
- 如果在一个系统里面有许多类,它们之间的区别公在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
- 一个系统需要动态地在几种算法中选择一种。
- 不希望客户端知道复杂的、与算法相关的数据结构,在具体策略类中封装算法和相关的数据结构,提高算法的保密性与安全性。