命令模式
来源:互联网 发布:gps数据解析c程序 编辑:程序博客网 时间:2024/05/24 06:18
日常生活中,我们去饭店吃饭,其实就是一种设计模式的体现:命令模式。
命令模式主要是把请求封装起来,把命令的请求者和命令的执行者解耦。在直白点,就是命令的请求者不知道具体的执行细节,而命令的执行者不知道谁在请求命令。他们之间唯一的联系就是命令对象本身了。
再说回到我们的饭店。我们顾客一般到了饭店,就是把点的订单交给服务员。服务员再把顾客的订单交给厨师,厨师做对应的菜。在这个过程中,服务员就是我们命令模式中的请求者了,订单是顾客交给服务员(请求者)的,请求者并不关心也不知道具体内容。他会直接把订单交给厨师(执行者)。而厨师(执行者)不知道也不关心具体是哪个服务员交给他的订单,他只要接到订单并开始做对应的菜(执行)就好了。
下面看代码:
//每个菜就是一个命令,并且含有执行方法 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给的就好(抽象))。
阅读全文
0 0
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- libcurl 编译指南(支持SSL)
- 网页发起qq聊天\微信聊天
- hdu 3861
- Python pandas 数据框的str列内置的方法详解
- JSON.parse()和JSON.stringify()
- 命令模式
- 判断时间是不是同一周
- [转]Linux下共享库(SO)有关的几个环境变量
- Linux常用命令
- c 俄罗斯方块小代码
- eaccelerator0.9.5.3模块安装
- Java垃圾回收机制
- 智能Web算法第二版前言和译者序
- UbuntuC开发个人使用配置及ONVIF开发配置