命令模式(command)

命令模式:

  将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。也称之为:动作Action模式,事务Transaction模式。

命令模式的结构: 

  Command 抽象命令类 

  ConcreteCommand 具体命令类 

  Invoker 调用者/请求者:请求的发送者,它通过命令对象来执行一个请求。一个调用者并不需要再设计的时候确定其接收者,因此它只与抽象命令之间存在关联。在程序运行时,将调用命令对象的execute(),间接调用接收者的相关操作。

  Receiver 接收者:接收者执行与请求相关的操作,具体实现对请求的业务处理。

 

  下面用代码来说明: 

  

创建命令执行者receiver

package com.note.pattern.command;

/***
 * 
 * 真正命令的执行者
 */
public class Receiver {
	
	public void action() {
		System.out.println("Receiver.action()");
	}
	
}

 

创建Command接口和ConcreteCommand实现类:

package com.note.pattern.command;

public interface Command {
	
	/**
	 * 这个方法是一个返回结果为空的方法。
	 * 实际项目中,可以根据需求设计多个不同的方法
	 */
	void execute();
	
}

  

package com.note.pattern.command;

public class ConcreteCommand implements Command{
	
	private Receiver receiver;//命令的真正的执行者
	

	public ConcreteCommand(Receiver receiver) {
		super();
		this.receiver = receiver;
	}



	@Override
	public void execute() {
		
		//命令真正执行前或后,执行相关的处理!
		receiver.action();
	}

}

  

创建Invoker,命令的发起者:

package com.note.pattern.command;

public class Invoker {
	
	//也可以通过容器List<Command>容纳很多命令对象,进行批处理。数据库底层的事务管理就是类似的结构!
	private Command command;

	public Invoker(Command command) {
		super();
		this.command = command;
	}
	
	 //业务方法 ,用于调用命令类的方法
	public void call() {
		command.execute();
	}
	

}

客户端测试

package com.note.pattern.command;

public class Client {

	public static void main(String[] args) {

		Command c = new ConcreteCommand(new Receiver());
		Invoker i = new Invoker(c);
		i.call();

	}

}

开发中应用场景: 

  Struts2中action的整个调用过程; 
  数据库事务机制的底层实现; 
  命令的撤销与恢复;

 

posted @ 2018-01-11 14:23  jianhuazhao  阅读(228)  评论(0编辑  收藏  举报