Java设计模式----命令模式(Command)

1. 命令模式是一个高内聚的模式,其定义为: 将一个请求封装成一个对象,从而让你用不同的请求把客户端参数化,对请求排队或记录请求日志,可以提供命令的撤销和恢复功能。

2.  命令模式中的3个角色

     a、 Receiver 接受者或执行者角色

     该角色是处理具体业务的角色,命令传递到这里是应该被执行的。

     b、 Command 命令角色

     需要执行的所有命令都在这里声明。

     c、 Invoker 调用者角色 

3.  命令模式的封装性非常好,把请求角色(Receiver)和调用者(Invoker)角色分开了,扩展性也有很好的保证,通用代码如下;

抽象的Receiver类:

/**
 * 抽象命令处理者
 * @author zqkj001
 *
 */
public abstract class Receiver {
   
	public abstract void  doSomething();
	
}
具体的Receiver角色类

/**
 * 具体命令处理者
 * @author zqkj001
 *
 */
public class ConcreteReceiver1 extends Receiver {

	@Override
	public void doSomething() {
		
		System.out.println("处理事务1...");

	}

}
抽象的Command类

/**
 * 抽象命令类
 * @author zqkj001
 *
 */
public abstract class Command {
    
	//定义一个子类共享的全局成员变量
	protected final Receiver receiver;
	
	public Command(Receiver re) {
		this.receiver=re;
	}
	
	public abstract void execute();
}
具体的Command角色类

/**
 * 具体命令类
 * @author zqkj001
 *
 */
public class ConcreteCommand1 extends Command {
    
	//设置新的命令处理者
	public ConcreteCommand1(Receiver re) {
		super(re);
	}
	
	//设置默认的命令处理者
	public ConcreteCommand1() {
		super(new ConcreteReceiver1());
	}

	@Override
	public void execute() {
		
		super.receiver.doSomething();

	}

}
调用者角色类

/**
 * 调用者类
 * @author zqkj001
 *
 */
public class Invoker {
    
	private Command command;
	
	public void setCommand(Command com) {
		this.command=com;
	}
	
	//执行命令
	public void  action(){
		this.command.execute();
	}
}
客户端类(测试类):

public class Test {
   
	public static void main(String[] args) {
		
		//定义一条发送给处理者的命令
		Command command=new ConcreteCommand1();
		//定义一个调用者(调用者接受所有的命令)
		Invoker invoker=new Invoker();
		//把命令交给调用者执行
		invoker.setCommand(command);
		
		invoker.action();
		
	}
}
4.  命令模式的优点

● 类间解耦

调用者角色与接收者角色之间没有任何依赖关系,调用者实现功能时只需调用Command抽象类的execute方法就可以,不需要了解到底是哪个接收者执行。

● 可扩展性

Command的子类可以非常容易地扩展,而调用者Invoker和高层次的模块Client不产生严重的代码耦合。

● 命令模式结合其他模式会更优秀

命令模式可以结合责任链模式,实现命令族解析任务;结合模板方法模式,则可以减少Command子类的膨胀问题。

5.  本例的代码类图








原文地址:https://www.cnblogs.com/elgin-seth/p/5293756.html