策略模式 Web.Net版 [原理+代码] 鸭子呱呱叫

小生初来炸到,呵呵,看了点资料,自己总结出来,对错都是很正常的,望大家多多批评指正! 由于俺是做web开发的,看了设计模式都是java的,感觉虽然还是比较懂的,但是毕竟是java的吗。。所以按照自己的理解,给翻译成C#版的了。。


策略模式定义:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。


设计原则:针对接口编程,而不是针对实现编程。


这里用的是个鸭子的例子,我也就直接翻译过来了。。吼吼。。


首先我理解策略模式最重要的就是针对接口,所以这里面当然要出现接口了。。


我先定义个页面输出函数吧,别回来页面都没有个write函数,嘎嘎


public class w
 {
  public static void s(string msg,System.Web.UI.Page page)
  {
   page.Response.Write(msg+"<br/>");
  }
 }


好了,开工了。这里我就来定义这个鸭子的方法了。。谁让是我写这篇文章呢。。嘎嘎。。
鸭子会叫,就叫quack,鸭子会游泳,就叫swim,鸭子还有外观,就叫display


好了,就这3个方法了,但是鸭子的叫声个不一样,所以就要用接口了,而swim,所有的鸭子都会,就是指定方法了,而鸭子的外观每个都不一样,就用抽象方法弄好了。


看看鸭子的基类:


public abstract class duck
 {
  public duck()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }


  protected quackBehavior quackBehaviorp;


  public void swim(System.Web.UI.Page page)
  {
   w.s("swim",page);
  }


  public abstract void display(System.Web.UI.Page page);//虚拟virtual 抽象abstract 注意:抽象必须放到抽象类里面


  public void quack(System.Web.UI.Page page)
  {
   quackBehaviorp.quack(page);
  }


 }//class duck end


这里的 quackBehavior 就是接口了,现在可以针对这个接口编程了,分别定义3个类,来实现这个接口,一个呱呱叫,一个哈哈叫,一个不会叫。并给出接口。


 public interface quackBehavior
 {
  void quack(System.Web.UI.Page page);
 }


 public class quackWawa : quackBehavior
 {
  #region quackBehavior 成员


  public void quack(System.Web.UI.Page page)
  {
   // TODO:  添加 quackWawa.quack 实现
   w.s("quack:wawa",page);
  }


  #endregion


 }


 public class quackHaha : quackBehavior
 {
  #region quackBehavior 成员


  public void quack(System.Web.UI.Page page)
  {
   // TODO:  添加 quackHaha.quack 实现
   w.s("quack:haha",page);
  }


  #endregion


 }


 public class quackNone : quackBehavior
 {
  #region quackBehavior 成员


  public void quack(System.Web.UI.Page page)
  {
   // TODO:  添加 quackNone.quack 实现
   w.s("quack:None",page);
  }


  #endregion


 }


现在我们来做两个鸭子吧,这里做个老鸭和木头鸭好了。


public class laoya : duck
 {
  public laoya()//构造函数
  {
   quackBehaviorp = new quackWawa();
  }
  
  public override void display(System.Web.UI.Page page)
  {
   w.s("display:I am laoya!",page);
  }
 }


 public class mutouya : duck
 {
  public mutouya()
  {
   quackBehaviorp = new quackNone();
  }
  public override void display(System.Web.UI.Page page)
  {
   w.s("display:I am mutouya!",page);
  }


 }


-------------------------------------


前台页面调用:


   duck laoya = new laoya();
   laoya.quack(this.Page);
   laoya.display(this.Page);


   duck mutouya = new mutouya();
   mutouya.display(this.Page);
   mutouya.quack(this.Page);


--------------------------------


quack:wawa
display:I am laoya!
display:I am mutouya!
quack:None


--------------------------------


看书的时候有句很经典的话,对我印象很深,虽然是很简单的东东。。呵呵


laoya laoya = new laoya() <---- 针对显示编程


duck laoya = new laoya() <----- 针对接口编程


感觉很有深意啊。。今天一天什么都没干。。只要学会一种模式就好了,策略模式,总算是粗略懂了一点,代码已经都调试成功了。。大家可以一起来探讨下 策略模式 在web上的应用,大家一般都是在什么时候用上啊。。自我感觉这个可以用到会员系统上,暂时也就能想到这么多了。。写的不好,大家一定要踊跃批评啊!!

posted @ 2007-11-12 15:55  彭成刚  阅读(314)  评论(0编辑  收藏  举报