命令模式

命令模式的关键是把请求封装,调用者不必关心具体实现,只需要下达需要的命令即可,下面是个点餐例子,很好的诠释了命令模式:

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();
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值