JAVA设计模式之 命令模式【Command Pattern】

一、概述

命令模式可以将请求发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。核心在于引入了命令类,通过命令类来降低发送者和接收者的耦合度,请求发送者只需指定一个命令对象,再通过命令对象来调用请求接收者的处理方法,命令模式是一种对象行为型模式。

二、使用场景

1>、系统要求请求发送者和接收者的解耦,使得调用者和接收者不直接交互;

2>、类似消息 请求/命令 队列处理;[命令装载在集合或队列中,通过遍历集合,达到命令的批量处理]

3>、当执行一个命令而触发多个具体命令的执行,从而实行对命令的批量处理,这种命令被称为组合命令或宏命令;

三、UML类图

四、参与者

1>、Command(抽象命令类):抽象命令类一般是一个抽象类或接口,在其中声明了用于执行请求的execute()等方法,通过这些方法可以调用请求接收者的相关操作。

2>、ConcreteCommand(具体命令类):具体命令类是抽象命令类的子类,实现了在抽象命令类中声明的方法,它对应具体的命令接收者对象,将接收者对象的动作绑定其中。在实现execute()方法时,将调用接收者对象的相关操作(operation)。

3>、Invoker(命令发起者/消息请求者):与抽象命令类存在关联关系,在命令发起时 将一个具体命令对象注入其中 再调用具体命令对象的执行方法(execute) 从而间接实现调用请求接收者的相关操作。

4>、Receiver(命令/消息 接收者):接收者执行与请求相关的操作,它具体实现对请求的业务处理(operation方法执行)。

五、用例学习

1、命令接收者A:ReceiverA.java

/**
 * 命令接收者A
 * @author  [email protected]
 *
 */
public class ReceiverA {

	public void operation(){
		System.out.println("我是命令接收者A,我已接收到命令,正在执行相应的业务操作方法");
	}
}

2、命令接收者B:ReceiverB.java

/**
 * 命令接收者B
 * @author  [email protected]
 *
 */
public class ReceiverB {

	public void operation(){
		System.out.println("我是命令接收者B,我已接收到命令,正在执行相应的业务操作方法");
	}
}

3、抽象命令类:Command.java

/**
 * 命令抽象类
 * @author  [email protected]
 *
 */
public abstract class Command {

	public abstract void execute();
}

4、具体命令类A:ConcreteCommandA.java

/**
 * 具体命令类A<br/>
 * 与命令接收者ReceiverA 关联
 * @author  [email protected]
 *
 */
public class ConcreteCommandA extends Command {

	private ReceiverA receiver;

	public ConcreteCommandA(){
		receiver = new ReceiverA();
	}

	@Override
	public void execute() {
		// 调用具体命令接收者的执行方法
		receiver.operation();
	}

}

5、具体命令类B:ConcreteCommandB.java

/**
 * 具体命令类B<br/>
 * 与命令接收者ReceiverB 关联
 * @author  [email protected]
 *
 */
public class ConcreteCommandB extends Command {

    private ReceiverB receiver;

	public ConcreteCommandB(){
		receiver = new ReceiverB();
	}

	@Override
	public void execute() {
		// 调用具体命令接收者的执行方法
		receiver.operation();
	}

}

6、命令发送者/消息请求者:Invoker.java

/**
 * 命令/消息发送者
 * @author  [email protected]
 *
 */
public class Invoker {
	// 维护一个抽象命令类的引用
	private Command command;

	/**
	 * 对具体命令对象的引用
	 * @param command
	 */
	public void setCommand(Command command){
		this.command = command;
	}

	/**
	 * 发送命令<br/>
	 * 调用具体命令执行类,间接的将消息/命令传递给了命令接收者执行
	 */
	public void runCommand(){
		command.execute();
	}

}

7、客户端测试类:Client.java

public class Client {

	public static void main(String[] args) {
		Command command = null;
		/*
		 * 如果要使命令发送给 命令接收者B(ReceiverB)处理
		 * 则只要实例化与ReceiverB 相关的命令类ConcreteCommandB即可
		 * 代码修改如下:
		 * command = new ConcreteCommandB();
		 *
		 * 以下是实例化命令类ConcreteCommandA 及将命令消息发送给与之关联的ReceiverA处理
		 */
		command = new ConcreteCommandA();
		Invoker invoker = new Invoker();
		invoker.setCommand(command);
		invoker.runCommand();
	}

}

六、其他

时间: 2024-11-09 03:35:19

JAVA设计模式之 命令模式【Command Pattern】的相关文章

设计模式之命令模式---Command Pattern

模式的定义 命令模式是一个高内聚的模式,定义如下: Encapsulate a request as an object,thereby letting you parameterize clients with different requests,queue or log requests,and support undoable operations 将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录日志,可以提供命令的撤销和恢复功能. 模式的使用场景 只要

浅谈JAVA设计模式之——命令模式(Command)

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/45569323 一.概述 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤消的操作. 二.适用性 1.抽象出待执行的动作以参数化某对象. 2.在不同的时刻指定.排列和执行请求. 3.支持取消操作. 4.支持修改日志,这样当系统崩溃时,这些修改可以被重做一遍. 5.用构建在原语操作上的高层操作构造一个系统. 三.参与者 1.Co

设计模式 - 命令模式(command pattern) 具体解释

命令模式(command pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 命令模式(command pattern) : 将请求封装成对象, 以便使用不同的请求\队列\日志来參数化其它对象. 命令模式也能够支持撤销操作. 简单的命令模式的实现: 1. 详细的类, 每个类都有特定的方法: /** * @time 2014年6月9日 */ package command; /** * @author C.L.Wang * */ publ

设计模式 - 命令模式(command pattern) 详解

命令模式(command pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy 命令模式: 将请求封装成对象, 以便使用不同的请求\队列\日志来参数化其他对象. 命令模式也支持可撤销操作. 命令模式: 调用者(Invoker); 命令(Command): 可执行方法(execute), 具体命令(Concrete Command); 接受者(Receiver): 调用命令(Set Command); 具体方法: 1. 具体对象. /** *

设计模式 - 命令模式(command pattern) 多命令 详解

命令模式(command pattern) 多命令 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考命令模式: http://blog.csdn.net/caroline_wendy/article/details/31379977 具体步骤: 1. 多命令, 把未使用的命令, 初始化为空对象(NoCommand), 根据参数(slot), 选择输出命令. /** * @time 2014年6月16日 */ package command; /**

设计模式 - 命令模式(command pattern) 撤销(undo) 详解

命令模式(command pattern) 撤销(undo) 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考命令模式: http://blog.csdn.net/caroline_wendy/article/details/31379977 命令模式可以用于执行撤销(undo)操作. 具体方法: 1. 对象类中需要保存状态, 如level. package command; public class CeilingFan { String loca

设计模式 - 命令模式(command pattern) 宏命令(macro command) 详解

命令模式(command pattern) 宏命令(macro command) 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考: 命名模式(撤销): http://blog.csdn.net/caroline_wendy/article/details/31419101 命令模式可以执行宏命令(macro command), 即多个命令的组合操作. 具体方法:  1. 其余代码与命令(撤销)一致 2. 添加宏命令(macro command),

设计模式 - 命令模式(command pattern) 撤销(undo) 具体解释

命令模式(command pattern) 撤销(undo) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.csdn.net/caroline_wendy/article/details/31379977 命令模式能够用于运行撤销(undo)操作. 详细方法: 1. 对象类中须要保存状态, 如level. package command; public class CeilingFan { String lo

设计模式 - 命令模式(command pattern) 多命令 具体解释

命令模式(command pattern) 多命令 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.csdn.net/caroline_wendy/article/details/31379977 具体步骤: 1. 多命令, 把未使用的命令, 初始化为空对象(NoCommand), 依据參数(slot), 选择输出命令. /** * @time 2014年6月16日 */ package command; /*

设计模式 ( 十三 ) 命令模式Command(对象行为型)

设计模式 ( 十三 ) 命令模式Command(对象行为型) 1.概述 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活. 例子1:电视机遥控器 : 遥控器是请求的发送者,电视机是请求的接收者,遥控器上有一些按钮如开,关,换频道等按钮就是具体命令,不同的按钮对应电视机的不同操作. 2.问题