大家好,欢迎来到程序视点!我是小二哥。
今天和大家聊一聊软件设计中关系型模式的另一种强大模式:命令模式(Command Pattern)
。
简介
还是把这张概总图放这里。
命令模式,是一种行为设计模式。先来看下它的定义。
命令模式将请求封装成一个对象,从而允许用户使用不同的请求并将其参数化,同时也支持将请求排队或记录日志等操作。
本质就是,对请求进行封装,一个请求对应于一个命令,将发出命令的责任和执行命令的责任分割开。
命令模式的核心思想是解耦请求的发送者和接收者,使得系统中的各个角色能够更加灵活地进行交互。
每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行相应的操作。命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口。
命令模式的关键在于引入了抽象命令类,请求发送者针对抽象命令类编程,只有实现了抽象命令类的具体命令才与请求接收者相关联。
每一个具体命令类对应一个请求的处理者(接收者),通过向请求发送者注入不同的具体命令对象可以使得相同的发送者对应不同的接收者,从而实现“将一个请求封装为一个对象,用不同的请求对客户进行参数化”,客户端只需要将具体命令对象作为参数注入请求发送者,无须直接操作请求的接收者。
*ps:这里我讲得有点啰嗦。怕的是才接触的小伙伴们不懂。实在不懂,先看下面的示例。看完后,再回来读一读这个部分。*
举例
我们休息之余,会时不时地看会儿电视节目。我们开、关电视、电视换台等等都是通过遥控器来处理的。
我们来分析下这个例子:
- 我们并不知道电视是如何通过电流点亮屏幕,来到主界面的;我们也不知道电视如何如何从CCTV-1跳转到CCTV-2的。
- 我们不用知道电视内部构造如何去实现上面的内容的。但我们知道,按遥控器的开机键,就能帮我们实现电视的开启和关闭。我们按遥控器的数值键,就能切换电视频道。
这就是我们的命令模式,让我们来简单实现下!
首先,命令是什么?就是让开启、关机、换台。但这是三个命令。因此,我们来一个命令接口。
代码语言:javascript复制public interface Command {
void execute();
}
ps:想一想为什么要定义这个接口呢?大多数文章会告诉你命令模式的结构中就需要这个抽象命令类角色。小二哥希望大家能自己先想想为什么。
再来实现具体的命令类。
代码语言:javascript复制public class TVOnCommand implement Command {
@Override
public void excecute() {
// TO DO 打开电视。
}
}
好了!问题来了:怎么才能打开电视呢?我们只给出了这样一个命令,但命令由谁来接收呢?
于是乎!我们需要一个命令接受类。
代码语言:javascript复制public class TVReceiver {
public void on() {
System.out.print("电视机打开了。");
}
public void off() {
System.out.print("电视机关闭了。");
}
public void changeChannel() {
System.out.print("电视机换台了。");
}
}