命令模式

 1、Commad模式是一种对象行为模式,它可以对发送者(sender)和接收者(receiver)完全解耦(decoupling)。("发送者" 是请求操作的对象,"接收者" 是接收请求并执行某操作的对象。有了 "解耦",发送者对接收者的接口一无所知。)这里,"请求"(request)这个术语指的是要被执行的命令。Command模式还让我们可以对 "何时" 以及 "如何" 完成请求进行改变。因此,Command模式为我们提供了灵活性和可扩展性。

2、命令模式的类图


从类图可以看出,命令模式是把发送者和接收者完全解耦。而实际的执行者是receiver。

3、看一下典型代码的实现,客户向服务员要求点菜,服务员将命令发送给厨师,厨师进行做菜。
 

package com.cvicse.receiver;

/**
 * 接收命令做事情者
 * @author Administrator
 *
 */
public class Kitchener {
	
	/**
	 * 执行的动作1
	 */
	public void cookBeef(){
		System.out.println("做牛肉");
	}
	/**
	 * 执行动作2
	 */
	public void cookChicken(){
		System.out.println("做鸡肉");
	}
}

 

package com.cvicse.command;

import com.cvicse.receiver.Kitchener;

public abstract class Command {
	protected Kitchener kitchener=new Kitchener();
	/**
	 * 执行操作方法
	 */
	public abstract void execute();
}

 

具体命令1
package com.cvicse.command;

/**
 * 做牛肉的具体命令
 * @author Administrator
 *
 */
public class CookBeefCommand extends Command {

	@Override
	public void execute() {
		super.kitchener.cookBeef();
	}
}

 

具体命令2
package com.cvicse.command;

/**
 * 做鸡肉的命令
 * @author Administrator
 *
 */
public class CookChilkenCommand extends Command {

	@Override
	public void execute() {
		super.kitchener.cookChicken();
	}
}

 

package com.cvicse.invoke;

import com.cvicse.command.Command;

public class Waiter {
	private Command comand=null;//引入命令对象
	
	/**
	 * 设置命令窗口
	 * @param comand
	 */
	public void setComand(Command comand){
		this.comand=comand;
	}
	
	/**
	 * 执行命令
	 */
	public void action(){
		this.comand.execute();
	}
}

 

客户端调用代码

package com.cvicse.client;

import com.cvicse.command.Command;
import com.cvicse.command.CookBeefCommand;
import com.cvicse.invoke.Waiter;

public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Waiter waiter=new Waiter();
		Command comand=new CookBeefCommand();
		waiter.setComand(comand);
		waiter.action();
	}
}

 4、总结该模式,感觉有点像夫妻两个人吵架后,儿子当传话筒相似。老婆下命令,儿子传达命令,自己去执行命令。

你可能感兴趣的:(命令模式)