设为首页 收藏本站
查看: 779|回复: 0

[经验分享] 设计模式系列——策略模式

[复制链接]

尚未签到

发表于 2015-11-26 09:09:14 | 显示全部楼层 |阅读模式
    小故事
      话说上篇我们说到的那个饭店,因为经营的好,所以最近招了很多大厨,又推出了很多的菜品。这时,每增加一个厨师,都需要往我们的菜单里增加一个菜的信息,还需要往简单工厂里增加一个新的判断,这个表总是需要修改或者是增加选项。
      在修改工厂的时候,饭店就需要暂停营业,然后去修改表格。看着来来往往的顾客没有办法营业的老板心情很不好。于是就想了一种别的方式去解决了该问题——老板把每道菜的制作者写在了菜单上,客户点菜后只需要告诉后厨选择系统需要哪个厨师做饭,厨师做完饭后再由后厨选择人员将这道菜传递给客户。
      这样在增加菜品的时候,不需要一直停业,只需要在修改菜单的时候稍微停止一小会就可以了大大降低了增加菜品(维护)所用的时间、、、

    策略模式
      老板用的模式就是策略模式,用户直接将需求传递给策略类(后厨选择人员)然后由策略类调用后厨的父类,通过父类多态出子类,得到结果然后传给客户。


      其中,客户传给策略类的是客户的需求(传递的是值),而策略模式返给客户的是具体的值。


     
策略模式的概念:它定义了算法家族,分别封装起来,让它们之间可以相互互换,此模式让算法的变化不会影响到使用算法的客户。



  
相关代码

  
      
  //客户端类
class Program
{
static void Main(string[] args)
{
//将菜单交给用户
Console.WriteLine("请输入您要吃啥?我们有豆腐脑、炒鸡蛋、炒豆角供您选择!!");
//用户选择需要的菜品
string greens="";
greens = Console.ReadLine ();

chef Chef;
//调用后厨选择人员选择厨师
Chef = greensoptionfactory .getchef (greens );
//得到食物
string result = Chef.getfood;
Console.WriteLine("先生您好,这是您的:{0}!",result);
}
}
//所有用到厨师的类都可以通过这个接口去调用
public class context
{
chef chef;
//这个方法实例化了具体的厨师
public context(chef chef)
{
this.chef = chef;
}
//这个方法将厨师的食物传出来
public void contextinterface()
{
chef.getfood;
}
}
//定义厨师类(厨师的父类)
public class chef
{
private string food = "";
//厨师的做菜方法
public virtual string getfood
{
get
{
return food;
}
}
}
//做豆腐脑的厨师
public class cheftofu : chef
{
public override string getfood
{
get
{
return "豆腐脑";
}
}
}
//炒豆角的厨师
public class chefbean : chef
{
public override string getfood
{
get
{
return "炒豆角";
}
}
}
//炒鸡蛋的厨师
public class chefegg : chef
{
public override string getfood
{
get
{
return "炒鸡蛋";
}
}
}
}


  策略模式与简单工厂模式



  相同点



  策略模式与简单工厂都是利用了多态,通过调用父类,实例化出不同的子类。在我们的例子中,简单工厂模式和策略模式都定义了chef类,其中有个getfood类,这里是空的。而我们实际在使用的时候用的是它的子类,而调用的时候直接调用父类,通过多态的方法分别得到不同的输出。




  不同点



  不同点是:1.简单工厂模式的客户端需要知道两个类:客户端首先要找到greensoptionfactory(简单工厂)类,然后从greensoptionfactory类里找到chef类,调用chef子类的方法。感觉就像老板跟秘书说:你去将老王找过来,我让他办点事。然后秘书将老王找过来,老板跟老王说:“你给我弄个炒鸡蛋”。老王将炒鸡蛋给老板;
策略模式的客户端只需要知道一个类:客户端只要找到context(策略)类,将参数传给它,然后策略类就可以将chef类的子类实例化,得到结果后返回给客户端。感觉就是老板跟秘书说:你去给我弄份炒鸡蛋。然后秘书去找老王,让他做点吃的,然后端给老板。  
  
             2.简单工厂模式使用时不需要传入选择,具体选择的过程由工厂来完成。如我们的例子中的我们只需要告诉简单工厂我要吃啥,具体选哪个厨师由简单工厂类判断;策略模式则是没有判断的功能,需要传入一个判断好的对象。所以策略模式中就要告诉策略类自己调用的是哪个类。

  


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-143701-1-1.html 上篇帖子: 如何制作一个vagrant的base box 及安装 additions 下篇帖子: Vagrant Quickstart
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表