前言:我也是初学者,希望大家能提出意见。另外转载请注明作者和出处,毕竟花了快一周的时间才完成。
策略模式(Strategy Pattern)和建造模式(Builder Pattern)实际上很相似,只有很小的差别。
建造模式让人去干活,具体怎么干已经给出了一定的步骤,在这个框架之内,你可以去发挥。
而策略模式让人去干活,不限制条件,我只告诉你要达到什么目的,其他的你海阔天空为所欲为,自己想办法,所以叫策略模式。
比如在我的上一篇文章《设计模式-Builder Pattern -领导者艺术-乾隆、和申、纪晓岚的故事》中,乾隆就如何对付格尔丹给出了一定的工作步骤,即必须是送黄金万两,送美女一名,骗住格尔丹。在这两个前提条件下,如何干那就看大臣的了,结果虽然条件是一样的,但和申和纪晓岚仍然得到了完全不同的结果。
在这一篇中,我讲的故事是康熙收复台湾的故事,他只选择了一个大臣,全权交给这个大臣负责(即采取了这个大臣的策略),反正你把台湾给我收回来就行了,怎么干都行我不管。结果,索额图和明珠各有妙计,均收回了台湾。
下面看看代码
客户端
using System;
namespace StrategyPattern
{
class Client
{
[STAThread]
static void Main(string[] args)
{
//选择索额图的办法
King king1=new King();
king1.SelectStrategy(new Suoetu());
Console.WriteLine("时间到转,历史重新上演了一遍========================================");
Console.WriteLine();
Console.WriteLine();
//选择明珠的办法
King king2=new King();
king2.SelectStrategy(new Minzhu());
Console.Read();
}
}
}
namespace StrategyPattern
{
class Client
{
[STAThread]
static void Main(string[] args)
{
//选择索额图的办法
King king1=new King();
king1.SelectStrategy(new Suoetu());
Console.WriteLine("时间到转,历史重新上演了一遍========================================");
Console.WriteLine();
Console.WriteLine();
//选择明珠的办法
King king2=new King();
king2.SelectStrategy(new Minzhu());
Console.Read();
}
}
}
策略模式相关类
using System;
namespace StrategyPattern
{
public class King
{
public King()
{
Console.WriteLine("康熙:朕准备解放台湾,做千古一帝,哪位爱卿愿意前往?");
}
//选择一个大臣(即策略),放手让他去做
public void SelectStrategy(Minister minister)
{
Console.WriteLine("康熙:{0}爱卿,一定要成功呀!",minister.Name);
Console.WriteLine();
minister.Strategy();
}
}
/// <summary>
/// 抽象的策略,这里是不同大臣的做法
/// </summary>
public interface Minister
{
string Name
{
get;
}
void Strategy();
}
public class Suoetu:Minister
{
public Suoetu()
{
Console.WriteLine("索额图:臣军机大臣索额图愿意前往!");
}
//索额图的办法
public void Strategy()
{
Console.WriteLine("索额图用了三个月的时间");
Console.WriteLine("筹集了白银一千万两,美女一万名,腐败干部一千名送进台湾。。。。");
Console.WriteLine("半年后,台湾由于各级官员大吃大喝,包养二奶,贪污腐败,竟然自己垮台了!");
Console.WriteLine();
Console.WriteLine();
}
public string Name
{
get
{
return "索额图";
}
}
}
public class Minzhu:Minister
{
public Minzhu()
{
Console.WriteLine("明珠:臣上书房参谋明珠愿意前往!");
}
//明珠的办法
public void Strategy()
{
Console.WriteLine("明珠用了三年时间");
Console.WriteLine("建立了三支无敌舰队,炮舰800艘,黑压压的驶进台湾海峡。。。。");
Console.WriteLine("三天之后,台湾变成一片焦土,竟然有二百艘战舰杀进了日本东京!");
Console.WriteLine();
Console.WriteLine();
}
public string Name
{
get
{
return "明珠";
}
}
}
}
namespace StrategyPattern
{
public class King
{
public King()
{
Console.WriteLine("康熙:朕准备解放台湾,做千古一帝,哪位爱卿愿意前往?");
}
//选择一个大臣(即策略),放手让他去做
public void SelectStrategy(Minister minister)
{
Console.WriteLine("康熙:{0}爱卿,一定要成功呀!",minister.Name);
Console.WriteLine();
minister.Strategy();
}
}
/// <summary>
/// 抽象的策略,这里是不同大臣的做法
/// </summary>
public interface Minister
{
string Name
{
get;
}
void Strategy();
}
public class Suoetu:Minister
{
public Suoetu()
{
Console.WriteLine("索额图:臣军机大臣索额图愿意前往!");
}
//索额图的办法
public void Strategy()
{
Console.WriteLine("索额图用了三个月的时间");
Console.WriteLine("筹集了白银一千万两,美女一万名,腐败干部一千名送进台湾。。。。");
Console.WriteLine("半年后,台湾由于各级官员大吃大喝,包养二奶,贪污腐败,竟然自己垮台了!");
Console.WriteLine();
Console.WriteLine();
}
public string Name
{
get
{
return "索额图";
}
}
}
public class Minzhu:Minister
{
public Minzhu()
{
Console.WriteLine("明珠:臣上书房参谋明珠愿意前往!");
}
//明珠的办法
public void Strategy()
{
Console.WriteLine("明珠用了三年时间");
Console.WriteLine("建立了三支无敌舰队,炮舰800艘,黑压压的驶进台湾海峡。。。。");
Console.WriteLine("三天之后,台湾变成一片焦土,竟然有二百艘战舰杀进了日本东京!");
Console.WriteLine();
Console.WriteLine();
}
public string Name
{
get
{
return "明珠";
}
}
}
}
运行效果如下:
结束语:设计模式不是你想象中的那么难吧?实际上它就在我们的生活当中,你可以使这扩展这个例子的策略类,增加一个大臣李光地如何?让他去解放台湾或许又是另外一番景象!