命令模式的关键是把请求封装,调用者不必关心具体实现,只需要下达需要的命令即可,下面是个点餐例子,很好的诠释了命令模式:
package com.jerry.design.command; import java.util.ArrayList; import java.util.List; // 测试类 public class Test1 { public static void main(String[] args) { //服务员拿着菜单走过来 Waiter w = new Waiter(); //点鱼香肉丝 Command c1 = new Yxrs(); //服务员记下 w.orderMenu(c1); //点干煸豆角 Command c2 = new Gbdj(); //服务员记下 w.orderMenu(c2); //下单 System.out.println("点餐完毕 开始做餐:"); w.orderFinish(); } } interface Command{ public void execute(); } interface Cook{ public void cooking(String name); } //一号厨师 class FirstCooker implements Cook{ @Override public void cooking(String name) { System.out.println("1号厨师正在做:"+name); } } //二号厨师 class SecondCooker implements Cook{ @Override public void cooking(String name) { System.out.println("2号厨师正在做:"+name); } } //鱼香肉丝命令 class Yxrs implements Command{ private Cook cooker = null; @Override public void execute() { cooker.cooking("鱼香肉丝"); } public void setCooker(Cook cooker) { this.cooker = cooker; } } //干煸豆角命令 class Gbdj implements Command{ private Cook cooker = null; @Override public void execute() { cooker.cooking("干煸豆角"); } public void setCooker(Cook cooker) { this.cooker = cooker; } } //水煮肉片命令 class Szrp implements Command{ private Cook cooker = null; @Override public void execute() { cooker.cooking("水煮肉片"); } public void setCooker(Cook cooker) { this.cooker = cooker; } } //菜单 class Menu implements Command{ private List<Command> commands = new ArrayList<Command>(); @Override public void execute() { for(Command c:commands){ c.execute(); } } public void addCommand(Command c){ commands.add(c); } } //服务员 class Waiter{ private Menu menu = new Menu(); //点菜 public void orderMenu(Command c){ FirstCooker firstCooker = new FirstCooker(); SecondCooker secondCooker = new SecondCooker(); if(c instanceof Yxrs){ ((Yxrs)c).setCooker(firstCooker);//1号做的鱼香肉丝比较好 这个菜由他做 } if(c instanceof Gbdj){ ((Gbdj)c).setCooker(secondCooker);//2号做的干煸豆角比较好 这个菜由他做 } if(c instanceof Szrp){ ((Szrp)c).setCooker(secondCooker);//2号做的水煮肉片比较好 这个菜由他做 } menu.addCommand(c); } //下单 public void orderFinish(){ menu.execute(); } }命令模式
最新推荐文章于 2025-08-11 09:20:14 发布