附一个简单的实现代码:
下面的表格是对应这个例子所涉及到的类跟方法对应到命令模式的标准名称:
Waitress(服务员) | invoker |
Short Order Cook(厨师) | Receiver |
orderUp(找厨师) | execute() |
Order(菜单,还没经过处理的) | Command |
Customer(顾客) | Client |
takeOrder(从顾客那拿原始菜单) | setCommand() |
典型的Command模式需要有一个接口.接口中有一个统一的方法,这就是"将命令/请求封装为对象"(在这里为了更好地理解这个实现生活中的例子,我没有使用标准的命令模式中的那些对象名方法名,大家可以按照上面的表格找到对应的标准名称):
public interface Order { public abstract void orderUp ( ); } |
具体不同命令/请求代码是实现接口Command,为了简单化下面只有一个具体命令,也就是说服务员这时候只接触一个顾客,注意在这里的OrderSlip是服务员把从顾客那拿到的原始菜单经过菜单处理柜台处理之后的菜单(OrderSlip),对于这一点大家慢慢体会下很容易想到怎么跟命令模式中的具体命令角色对应上的:
public class OrderSlip implements Order { public Cook cook; //构造函数被传进一个具体的厨师来做顾客的所点的东西,当orderUp被//调用时,厨师将作为这个请求的接受者。 public OrderSlip(Cook cook){ this.cook=cook; } // orderUp方法调用命令接受者的方法cookmakeBurger, cookmakeShake public void orderUp ( ) { cook.cookmakeBurger();//让一个厨师做Burger cook.cookmakeShake();//让一个厨师做Shake } } } |
Cook |
|
cookmakeBurger():void |
cookmakeShake():void |
服务员使用这个菜单,完成她的任务(命令对象)
public class Waitress { Order order; public Waitress(){} public void takeOrder (Order orderslip){//这里对应前面表格中的标准的 //命令模式中的setOrder() order= orderslip; } public void fireOrder ( ){//注意,前面我们提到了服务员知道所有的 //菜单都支持orderUp()这个方法而且她可以在需要准备一个饭菜的任何 //时候来调用这个方法。 order. orderUp(); } } |
顾客所做的:
public class Customer { public static void main(String []args){ Waitress waitress=new Waitress();//顾客叫来了一个服务员 Cook cook=new Cook();//因为顾客是通过服务员简接地请求厨师为他//做吃的 OrderSlip orderslip=new OrderSlip(cook);//顾客叫了一个菜单 waitress.takeOrder(orderslip);//服务员拿到经过处理后的菜单 waitress.fireOrder();//需要准备一个饭菜的任何时候到了 } } |