浏览:7332007-11-12 15:47   来自彭成刚      :

小生初来炸到,呵呵,看了点资料,自己总结出来,对错都是很正常的,望大家多多批评指正! 由于俺是做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上的应用,大家一般都是在什么时候用上啊。。自我感觉这个可以用到会员系统上,暂时也就能想到这么多了。。写的不好,大家一定要踊跃批评啊!!

楼主
  6个月前   shengnet      :
支持一下。
回复  1楼 回到顶楼 
  6个月前   ELVA      :
学习一个。
回复  2楼 回到顶楼 
  6个月前   彭成刚      :
希望大家能够提出自己的想法能和我交流交流,刚开始学,已经两天了,还没有旅顺头绪,望高手指点啊!!
回复  3楼 回到顶楼 
  6个月前   Justin      :
欢迎去我那里看看,有问题可以留言
回复  4楼 回到顶楼 
  5个月前   looping      :
最近也在看这本headfirst设计模式,看完这个版本再学习下你写的代码。。
回复  5楼 回到顶楼 
  5个月前   老段      :
越抽象的就是越稳定的
回复  6楼 回到顶楼 
  3周前   笨→鸟(Bird)      :
headfirst通熟易懂 是本不错的书。
回复  7楼 回到顶楼 

你还不是小组成员,加入小组以后才能发布新主题!
> 返回“设计模式”


其他话题

1 26752