命令模式

日常生活中,我们去饭店吃饭,其实就是一种设计模式的体现:命令模式。

命令模式主要是把请求封装起来,把命令的请求者和命令的执行者解耦。在直白点,就是命令的请求者不知道具体的执行细节,而命令的执行者不知道谁在请求命令。他们之间唯一的联系就是命令对象本身了。

再说回到我们的饭店。我们顾客一般到了饭店,就是把点的订单交给服务员。服务员再把顾客的订单交给厨师,厨师做对应的菜。在这个过程中,服务员就是我们命令模式中的请求者了,订单是顾客交给服务员(请求者)的,请求者并不关心也不知道具体内容。他会直接把订单交给厨师(执行者)。而厨师(执行者)不知道也不关心具体是哪个服务员交给他的订单,他只要接到订单并开始做对应的菜(执行)就好了。

下面看代码:

//每个菜就是一个命令,并且含有执行方法
    public interface MakeMeal
    {
        void Make();
    }

    public class Meal1
    {
        public void Make()
        {
            Console.WriteLine("Meal1");
        }
    }

    public class Meal2
    {
        public void Make()
        {
            Console.WriteLine("Meal2");
        }
    }

    public class MakeMeal1 : MakeMeal
    {
        Meal1 meal1;

        public MakeMeal1(Meal1 meal1)
        {
            this.meal1 = meal1;
        }

        public void Make()
        {
            meal1.Make();
        }
    }

    public class MakeMeal2 : MakeMeal
    {
        Meal2 meal2;

        public MakeMeal2(Meal2 meal2)
        {
            this.meal2 = meal2;
        }

        public void Make()
        {
            meal2.Make();
        }
    }

    public class Waiter
    {
        private List<MakeMeal> mealList;
        //服务员从顾客那得到菜单列表
        public Waiter(List<MakeMeal> mealList)
        {
            this.mealList = mealList;
        }
        //服务员传递菜单列表
        public List<MakeMeal> TakeList()
        {
            return mealList;
        }
    }

    public class Chef
    {
        private List<MakeMeal> mealList;
        //厨师得到菜单列表
        public Chef(List<MakeMeal> mealList)
        {
            this.mealList = mealList;
        }
        //厨师遍历菜单列表里的所有菜,调用执行
        public void Make()
        {
            foreach(MakeMeal makeMeal in mealList)
            {
                makeMeal.Make();
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            //我们就是顾客,我们选好几个菜后,放入菜单列表
            List<MakeMeal> mealList = new List<MakeMeal>();
            Meal1 meal1 = new Meal1();
            Meal2 meal2 = new Meal2();
            MakeMeal1 makeMeal1 = new MakeMeal1(meal1);
            MakeMeal2 makeMeal2 = new MakeMeal2(meal2);
            mealList.Add(makeMeal1);
            mealList.Add(makeMeal2);
            //我们叫来一个服务员,把菜单交给他
            Waiter waiter = new Waiter(mealList);
            //服务员把菜单交给厨师,在这个过程中,服务员不知道菜单的细节,他只要把菜单直接给厨师就好了
            Chef chef = new Chef(waiter.TakeList());
            //厨师拿到菜单后,开始做菜
            chef.Make();
        }
    }
就像我们上面所说的,服务员(请求者)在接到菜单,把菜单传给厨师的过程中,不知道到菜单的细节。

这样,无论我们怎么修改菜单的细节,请求者都不关心,他只负责传递就好了。而厨师呢,也不用管你都点的哪些东西,只要把菜单上有的菜全部做一遍就好了。

PS:其实最后实现时,还是依赖了具体实现而不是依赖接口。(厨师接收菜单时不应该知道具体是谁给他的菜单,只知道是Waiter给的就好(抽象))。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值