前言:我也是初学者,希望大家能提出意见。另外转载请注明作者和出处,毕竟花了快一周的时间才完成。

策略模式(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();
        }

    }

}



策略模式相关类

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 "明珠";
            }

        }

    }

}



运行效果如下:



结束语:设计模式不是你想象中的那么难吧?实际上它就在我们的生活当中,你可以使这扩展这个例子的策略类,增加一个大臣李光地如何?让他去解放台湾或许又是另外一番景象!

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


Copyright © fred