前言
今天来讲讲命令模式。
正文
概念
命令模式属于行为型设计模式,又称为行动模式或者交易模式,这个模式常常用在游戏开发设计中。命令模式把请求以命令的形式封装在对象中,并传给调用对象,然后调用对象寻找可以处理这个命令的对象,把命令传给相应的对象,执行命令。
常见的应用场景有游戏开发中命令角色执行操作,还有GUI开发中事件也属于命令模式中的一种。
实现
命令模式是把发出命令与执行命令的职责分隔开,委派给不同的对象,所以它允许请求与接收方相互独立,两方可以不知道对方的接口,甚至不需要知道命令是否被接收或者被执行。
命令模式中有几个角色:
- 命令(Command/Order):可以是一个接口,声明命令的抽象接口
- 具体命令:实现命令的具体类,通常有execute()方法,用于调用接收者的操作。
- 请求者(Invoker):负责调用命令对象去执行这个命令。
- 接收者(Receiver):负责具体执行一个命令。
我们先简单实现一个命令模式demo。
先创建Receiver对象,设置action方法,即收到命令会执行什么。
1 | public class Receiver { |
接着我们创建command接口与它的具体实现。
1 | public interface Command { |
然后是创建请求者,这里把命令当作参数传给请求者。
1 | public class Invoker { |
最后是客户端调用
1 | public class Client { |
这里invoker的值传入,是通过构造方法注入,但实际中,我们的invoker对象往往需要接收许多个命令,这时我们在invoker中就可以设置set方法,将command对象通过setCommand方法注入,实现一个invoker对象循环使用的目的。
优缺点
命令模式的优点就是调用者与接受者之间没有依赖关系,调用者实现功能只需要调用Command类中的execute方法就可以,不必关心接受者是谁,怎么接收。其次就是命令模式易扩展,实现command接口就可以实现新命令,在装配时,把具体的对象设置到命令中就可以使用这个命令,而invoker与Client已有代码不用发生改变。
缺点在于命令模式可能会导致具体命令类过多,不易维护。