`

设计模式学习笔记——命令模式

阅读更多

 

命令模式

属于行为模式

命令模式将一个请求或者操作封装到一个命令对象中。允许系统使用不同的请求将客户端参数化,对请求排队或者记录请求日志,提供命令的撤销,恢复能力

 

由于请求方和接收方被命令对象相对分割,从而有了下面这些优点

1 命令模式使新的命令很容易被加入

2 允许接受请求方否决请求

3 可较容易地设计一个命令队列

4 可以实现对请求的Undo,Redo

5 可以将命令计入日志

 

类图一枚

命令模式设计5个角色

客户角色Client:客户端,创建命令并确定接收对象

命令角色Command:所有具体命令的抽象接口

具体命令角色ConcreteCommand:接受者与行为之间的联系,调用接受者相关操作

请求者角色Invoker:调用命令对象执行请求

接受者角色Receiver:具体实施动作

 

下面是最简单的命令模式

首先是抽象的Command以及一个具体的ConcreteCommand,可以看到其中只定义实现了一个execute方法,ConcreteCommand持有一个接受者对象,execute方法实际是调用receiver中的action方法。

 

public interface Command {
	public void execute();
}
public class ConcreteCommand implements Command{
	private Receiver receiver;
	public void setReceiver(Receiver receiver){
		this.receiver=receiver;
	}
	@Override
	public void execute() {
		receiver.action();
	}
}
  

Receiver对象,其中只有action方法,即表示实际需要进行的动作

 

public class Receiver {
	public void action(){
		System.out.println("Reciever has done the Action");
	}
}
 

Invoker请求者对象,持有具体要委派的命令,并调用命令的execute方法

 

public class Invoker {
	private Command command;
	public void setCommand(Command command){
		this.command=command;
	}
	public void runCommand(){
		command.execute();
	}
}
 

客户端只是负责创建命令和确定接受者,其中的连接由各自完成。

 

public class Client {
	public static void main(String[] args) {
		Receiver receiver=new Receiver();
		ConcreteCommand command=new ConcreteCommand();
		command.setReceiver(receiver);
		Invoker invoker=new Invoker();
		invoker.setCommand(command);
		invoker.runCommand();
	}
}
 

最终可以看到输出了一行结果:

Reciever has done the Action

 

其实从上面的调用过程中就可以清楚的看到命令模式的整个运行过程

1 客户端创建命令对象,指明接受者

2 请求者对象保存命令

3 请求者对象通过runCommand发出请求,在这之中,可以在命令角色中通过一个状态变量控制undo redo或者其他操作的控制

4 命令对象调用接收者方法执行操作

 

在上面的例子并没有体现出关于undo,redo的功能

而如果需要这类功能,同样是在ConcreteCommand中进行处理,例如添加一个List来记录前后操作,并在执行时更新。

 

命令模式有一个比较明显的缺点,就是当命令数量比较多时,会产生相当数量的ConcreteCommand具体命令类。

 

总体来说命令模式即是由原来的请求-接收中间添加了一个命令对象,通过命令对象实现了两者间的解耦,并添加某种程度的控制和记录。

 

http://www.cnblogs.com/sjms/archive/2010/07/16/1778527.html

上面的博客中有关于undo的一个简单实现,应该说研磨设计模式是写得非常浅显易懂的,包括其中其他的部分 推荐一看

  • 大小: 4.3 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics