欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

学习札记:设计模式之命令模式

程序员文章站 2022-05-26 08:51:24
...

一.命令模式的定义

将一个请求封装成对象,从而使不同的请求参数化,对请求排队、记录以及撤销,是一种行为性模式

二.命令模式的写法

名利模式有四个角色,一个Invoke(负责接收处理指令)抽象的指令Command 具体的指令ConcreteCommand以及命令的执行者Receiver。 这里拿我们到饭店吃饭时点餐的例子,来看看下面的UML类图
学习札记:设计模式之命令模式
我们来看看代码这么写的,首先看服务员代码,通过UMLl类图知道,服务员只需要知道命令,并可以取消,执行,添加命令即可:

/**
 * 理解成服务员
 * @author Seven
 *
 */
public class Invoker {

	List<Command> commands=new ArrayList<>();
	
	public void addCommand(Command command) {
		System.out.println("服务员将客人命令追加到队列中");
		commands.add(command);
		
	}
	public void execute() {
		System.out.println("服务员执行客人的命令对列");
		for (Command command : commands) {
			command.executeCommand();
		}
	}
	
	public void removeCommand(Command command) {
		System.out.println("服务员将客人命令取消");
		commands.remove(command);
	}
}

那抽象命令应该怎么写呢,首先是有个具体执行者的引用,也就是厨师,然后将执行方法抽象出来,对应的命令有对应的实现,下面请看代码:

/**
 * 理解成抽象的行为 比如烤鸡 烤羊肉串
 * 
 * @author Seven
 *
 */
public abstract class Command {
	protected Receiver receiver;


	public void setCommand(Receiver receiver) {
		this.receiver = receiver;
	}

	public abstract void executeCommand();
}

/** 具体的命令比如烤鸡
 * @author Seven
 *
 */
public class ConcreteCommand  extends Command{


	@Override
	public void executeCommand() {
			if(receiver!=null) {
				receiver.execute();
			}else {
				System.out.println("no executor");
			}
	}

}

下面就是大厨也就是接受命令、执行干活的人了

/**
 * 真正的执行者 比如大厨
 * @author Seven
 *
 */
public class Receiver {

	public void execute() {
		System.out.println("干活");
	}

}

好了,这个就是命令模式,他这个有点像生产消费者模型,服务员生产需求,大厨赋值执行需求,

相关标签: 命令模式