命令模式的关键是把请求封装,调用者不必关心具体实现,只需要下达需要的命令即可,下面是个点餐例子,很好的诠释了命令模式:
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();
}
}