设计模式之命令模式

命令模式

命令模式
 * 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作
 * 要点:
    1、命令模式将发出请求的对象和执行请求的对象解耦
    2、在被解耦的两者之间是通过命令对象进行沟通的。命令对象封装了接收者和一个或一组动作
    3、调用者通过调用命令对象的execute()发出请求,这会使得接收者的动作被调用


命令模式的角色:

命令接口(Command):声明执行操作的接口

接口实现(ConcreteCommand):命令接口实现,需要保存接收者的操作,并执行相应的操作

命令执行者(Invoker):要求命令执行此次请求

命令接收人(Receiver):由命令的实现维护实例,并在命令执行时处理相应的任务。


接下来,编写一个简单的命令模式


Command类,用来声明执行操作的接口。

/**
 * 命令接口,定义需要执行的命令
 * @author zzj
 *
 */
public interface Command {
    void execute();
    void undo();

}

ConcreteCommand类,将一个接收者对象绑定于一个动作,调用接收者相应的操作,以实现Execute。
/**
 * 具体命令对象,将接受者绑定与一个动作,调用接受者相应的操作,以实现Execute
 * @author zzj
 *
 */
public class ConcreteCommand implements Command {
	
	private Receiver receiver;
	
	public ConcreteCommand(Receiver receiver) {
		this.receiver = receiver;
	}

	@Override
	public void execute() {
		receiver.action();
	}

	@Override
	public void undo() {
		receiver.unAction();
	}

}

Invoker类,要求该命令执行这个请求。
/**
 * 命令发起者
 * @author zzj
 *
 */
public class Invoker {
	private Command command;

	public Command getCommand() {
		return command;
	}

	public void setCommand(Command command) {
		this.command = command;
	}
	
	public void executeCommand(){
		command.execute();
	}
	public void unDoCommand(){
		command.undo();
	}
	

}

Receiver类,知道如何实施与执行一个与请求相关的操作,任何类都可能作为一个接收者。
/**
 * 命令接收者,命令真正执行人
 * @author zzj
 *
 */
public class Receiver {
	
	public void action(){
		System.out.println("do the task");
	}
	public void unAction(){
		System.out.println("undo!!!");
	}

}

客户端代码,创建一个具体命令对象并设定它的接收者
public class Test {
	public static void main(String[] args){
		//创建命令执行者
		Receiver receiver = new Receiver();
		//创建命令对象,设置它的具体接收对象
		Command command = new ConcreteCommand(receiver);
		//创建命令者
		Invoker invoker = new Invoker();
		//设置命令对象
		invoker.setCommand(command);
		invoker.executeCommand();
		invoker.unDoCommand();
	}
命令模式是一种行为型设计模式,它将请求封装成一个对象,从而使得请求的发送者和接收者解耦。在命令模式中,请求以命令的形式包裹在对象中,并传递给调用对象。调用对象寻找可以处理该命令的合适的对象,并将命令传递给相应的对象,该对象执行命令。 在C语言中,可以使用函数指针来实现命令模式。具体步骤如下: 1. 定义一个命令接口,该接口包含一个执行命令的方法。 2. 创建具体的命令类,实现命令接口,并在执行方法中调用相应的函数。 3. 创建一个调用者类,该类包含一个命令对象,并提供一个执行命令的方法。 4. 在调用者类中,将命令对象传递给相应的对象,并调用命令对象的执行方法。 下面是一个简单的示例代码: ```c #include <stdio.h> // 定义命令接口 typedef struct { void (*execute)(void); } Command; // 创建具体的命令类 typedef struct { Command command; void (*function)(void); } ConcreteCommand; void concreteCommand_execute(void) { printf("执行具体的命令\n"); } // 创建调用者类 typedef struct { Command *command; void (*setCommand)(Command *command); void (*executeCommand)(void); } Invoker; void invoker_setCommand(Command *command) { Invoker *invoker = (Invoker *)command; invoker->command = command;} void invoker_executeCommand(void) { Invoker *invoker = (Invoker *)invoker->command; invoker->command->execute(); } int main() { // 创建具体的命令对象 ConcreteCommand concreteCommand; concreteCommand.command.execute = concreteCommand_execute; concreteCommand.function = concreteCommand_execute; // 创建调用者对象 Invoker invoker; invoker.setCommand((Command *)&concreteCommand); invoker.executeCommand(); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值