设计模式-命令模式

来源:《设计模式之禅》

定义:将一个请求封装成一个对象,使用不同的请求把客户端参数化,对请求排队或者记录请求日志,提供命令的撤销或回复功能。

命令模式三个角色:

  1. receiver接受者角色,实际执行命令角色。

  2. command命令角色,声明需要执行的命令。

  3. invoker调用者角色,接收传递的命令,并执行命令。

类图:

设计模式-命令模式

命令抽象类:

/**
 * 
 */
package cc.rico.pattern.command;

/**
 * @author rico
 * 命令抽象类
 */
public abstract class Command {
	
	/**
	 * 命令执行方法
	 */
	public abstract void execute();
}

具体命令:

/**
 * 
 */
package cc.rico.pattern.command;

/**
 * @author rico
 * 具体命令
 */
public class ConcreteCommand1 extends Command {
	private Receiver receiver;
	
	public ConcreteCommand1(Receiver receiver) {
		this.receiver = receiver;
	}

	/* (non-Javadoc)
	 * @see cc.rico.pattern.command.Command#execute()
	 */
	@Override
	public void execute() {
		receiver.receiveAction();
	}
}
/**
 * 
 */
package cc.rico.pattern.command;

/**
 * @author rico	
 * 具体命令
 */
public class ConcreteCommand2 extends Command {
	private Receiver receiver;
	
	public ConcreteCommand2(Receiver receiver) {
		this.receiver = receiver;
	}
	
	/* (non-Javadoc)
	 * @see cc.rico.pattern.command.Command#execute()
	 */
	@Override
	public void execute() {
		receiver.receiveAction();
	}

}

抽象接收者:

/**
 * 
 */
package cc.rico.pattern.command;

/**
 * @author rico
 * 抽象接收者
 */
public abstract class Receiver {
	/**
	 * 接收方法
	 */
	public abstract void receiveAction();
}

具体接收者:

/**
 * 
 */
package cc.rico.pattern.command;

/**
 * @author rico
 * 具体接收者
 */ 
public class ConcreteReceiver1 extends Receiver {

	/* (non-Javadoc)
	 * @see cc.rico.pattern.command.Receiver#receiveAction()
	 */
	@Override
	public void receiveAction() {
		System.out.println("###ConcreteReceiver1.receiveAction...");
	}

}
/**
 * 
 */
package cc.rico.pattern.command;

/**
 * @author rico
 * 具体接收者
 */ 
public class ConcreteReceiver2 extends Receiver {

	/* (non-Javadoc)
	 * @see cc.rico.pattern.command.Receiver#receiveAction()
	 */
	@Override
	public void receiveAction() {
		System.out.println("###ConcreteReceiver2.receiveAction...");
	}

}

调用者:

/**
 * 
 */
package cc.rico.pattern.command;

/**
 * @author rico
 * 调用者
 */
public class Invoker {
	private Command command;
	
	public Invoker(Command command) {
		this.command = command;
	}
	
	/**
	 * 执行命令 
	 */
	public void action() {
		command.execute();
	}
}

场景:

/**
 * 
 */
package cc.rico.pattern.command;

/**
 * @author BG
 *
 */
public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// 接收者
		//Receiver receiver = new ConcreteReceiver1();
		// 定义发送给接收者的命令
		//Command command = new ConcreteCommand1(receiver);
		
		// 接收者
		Receiver receiver = new ConcreteReceiver2();
		// 定义发送给接收者的命令
		Command command = new ConcreteCommand2(receiver);
		
		Invoker invoker = new Invoker(command);
		invoker.action();
	}
}


代码:

命令模式优点:

  1. 类间解耦,调用者和接收者没有任何依赖关系,调用者只需发出命令(command),不需要了解具体的接收者。

  2. 可扩展性,Command子类很容易扩展,调用者和高层模块不产生严重的耦合。

  3. 命令模式和其他模式结合使用。

命令模式缺点:

     有N个命令就有个N个命令实现类,类膨胀大。

使用场景:

     是命令的地方都可以使用命令模式,如GUI按钮点击事件。

扩展:


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