策略模式 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上的应用,大家一般都是在什么时候用上啊。。自我感觉这个可以用到会员系统上,暂时也就能想到这么多了。。写的不好,大家一定要踊跃批评啊!!
生活的意义就是你自己知道你要做什么,明确目标。没有目标,后面都是瞎扯!
https://pengchenggang.gitee.io/navigator/
SMART原则:
目标必须是具体的(Specific)
目标必须是可以衡量的(Measurable)
目标必须是可以达到的(Attainable)
目标必须和其他目标具有相关性(Relevant)
目标必须具有明确的截止期限(Time-based)