zoukankan      html  css  js  c++  java
  • 设计模式系列——策略模式

        小故事

        话说上篇我们说到的那个饭店,因为经营的好,所以最近招了很多大厨,又推出了很多的菜品。这时,每增加一个厨师,都需要往我们的菜单里增加一个菜的信息,还需要往简单工厂里增加一个新的判断,这个表总是需要修改或者是增加选项。

        在修改工厂的时候,饭店就需要暂停营业,然后去修改表格。看着来来往往的顾客没有办法营业的老板心情很不好。于是就想了一种别的方式去解决了该问题——老板把每道菜的制作者写在了菜单上,客户点菜后只需要告诉后厨选择系统需要哪个厨师做饭,厨师做完饭后再由后厨选择人员将这道菜传递给客户。

        这样在增加菜品的时候,不需要一直停业,只需要在修改菜单的时候稍微停止一小会就可以了大大降低了增加菜品(维护)所用的时间、、、

        策略模式

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

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

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

        相关代码

            

      //客户端类
        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.简单工厂模式使用时不需要传入选择,具体选择的过程由工厂来完成。如我们的例子中的我们只需要告诉简单工厂我要吃啥,具体选哪个厨师由简单工厂类判断;策略模式则是没有判断的功能,需要传入一个判断好的对象。所以策略模式中就要告诉策略类自己调用的是哪个类。


  • 相关阅读:
    CodeForces 1059B
    CodeForces 714A
    浅析母函数
    CodeForces 816C 思维
    CodeForces 816B 前缀和
    CodeForces
    Java项目读取resources资源文件路径那点事
    原型模式
    一次给女朋友转账引发我对分布式事务的思考
    连续最大字段和问题
  • 原文地址:https://www.cnblogs.com/liyasong/p/6387883.html
Copyright © 2011-2022 走看看