(23)烤羊肉串引来的思考——命令模式

命令模式

将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。(摘抄)

命令模式我感觉结合代码来讲会比较好讲,所以我先写代码把

import java.util.ArrayList;
import java.util.List;

//Action类,执行具体的操作
public class Action
{
	void actionA()
	{
		System.out.println("A");
	}
	void actionB()
	{
		System.out.println("B");
	}
}

//Command类,用来声明执行操作的接口
public abstract class Command
{
	Action action;
	
	public Command(Action action)
	{
		this.action = action;
	}
	
	public abstract void execute();
}

public class ConcreteCommandA extends Command
{

	public ConcreteCommandA(Action action)
	{
		super(action);
	}
	@Override
	public void execute() {
		// TODO Auto-generated method stub
		action.actionA();
	}
	
}

public class ConcreteCommandB extends Command
{

	public ConcreteCommandB(Action action)
	{
		super(action);
	}
	@Override
	public void execute() {
		// TODO Auto-generated method stub
		action.actionB();
	}
	
}

//Invoker类,要求该命令执行这个操作
public class Invoker
{
	private List<Command> commands = new ArrayList<Command>();
	//在add和delete方法中可以执行排队请求和记录日志和否决请求操作
	public void addCommand(Command command)
	{
		commands.add(command);
	}
	
	public void deleteCommand(Command command)
	{
		commands.remove(command);
	}
	
	public void executeCommand()
	{
		for (Command command : commands)
		{
			command.execute();
		}
	}
}

class Client
{
	public static void main()
	{
		Action action = new Action();
		Command aCommand = new ConcreteCommandA(action);
		Command bCommand = new ConcreteCommandB(action);
		Invoker invoker = new Invoker();
		invoker.addCommand(aCommand);
		invoker.addCommand(bCommand);
		invoker.deleteCommand(aCommand);
		invoker.executeCommand();
	}
}

一个命令模式的模板差不多就是这样了,从这个模板可以很清晰的看出来要添加新的命令也十分容易,删除也很容易,添加新的命令类,更是这里的一大亮点,当你需要一个ConcreteCommandC来同时执行actionA和actinoB那么新建一个ConcreteCommandC类就可以了,在execute方法中,添加这两个方法的执行就ok,对于设计模式的一些原则运用得十分到位。

命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分隔开了。(摘抄)

命令模式的作用

1.它能较容易地设计一个命令队列。

2.在需要的情况下,可以较容易地将命令记入日志。

3.允许接受请求的一方决定是否要否决请求。

4.可以容易的实现对请求的撤销和重做。

5.由于加进新的具体命令类不影响其他的类,因此添加新的具体命令类很容易。

(摘抄)

注意

敏捷开发原则告诉我们,不要为代码添加基于猜测的,实际不需要的功能。如果不清楚一个系统是否需要命令模式,一般就不要急着去实现它,事实上,在需要的时候通过重构实现这个模式并不困难,只有在真正需要如撤销/恢复操作等功能时,把原来的代码重构为命令模式才有意义。(摘抄)

文章导航