简介
命令模式(Command Pattern)属于设计模式中的行为型模式。命令模式实现了施令者与具体命令的解耦,并且可以实现撤销等命令相关功能。
命令模式(Command Pattern):将一个请求封装为一个对象,从而让我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式是一种对象行为型模式,其别名为动作(Action)模式或事务(Transaction)模式。
命令模式的核心是命令,何为命令?其实命令在日常用于中叫请求,调用一个类的方法,其实就是给类发一个命令让它去执行这个方法,命令模式就是将原本的函数调用封装到类中,由方法级别提升到类级别,从而实现请求者与执行者的解耦,并且可以提供更多的功能,譬如撤销,记录日志等。
命令模式的角色有抽象命令角色,具体命令角色,命令接收者角色及命令调用者角色。
抽象命令:定义命令的通用接口,用于提供给调用者统一的调用API 具体命令:实现具体的命令执行逻辑 命令接收者:真正的逻辑实现地方,(命令提供给调用方一个统一界面,真正逻辑并不在命令里实现,如果没有命令接收者,具体命令就需要充当命令接收者的角色) 调用者:请求的发起方
其实应该还有一个协调者角色,它负责初始化具体的命令,设置到调用者中,不过这个一般在main 函数中实现,不列到此处。
既然是将对象请求封装为命令,那么所有的代码其实都可以封装成命令模式,区别只是有没有必要。在具体实践中,用户界面相关使用最多,因为命令模式支持的撤销、日志、记录等功能都特别符合用户需求。
在浏览器或手机APP 中,都会提供返回功能,用户只需要点击返回按钮就可以返回到上一层,对于开发人员来说,这个功能浏览器和手机都已经提供了,只需要调用一个 back 就可以。如果让我们来实现,就可以使用命令模式来将 back 映射到撤销功能。
/**
* 在浏览器中是URL跳转
* 在手机中是 Activity 跳转
*/
public interface Command<T> {
void execute(T param);
void back();
}
public class UrlCommand implements Command<String> {
private WindowHanlder windowHandler;
private Window preWindow;
private UrlReceiver receiver;
public UrlCommand(UrlReceiver rec) {
this.receiver = rec;
}
public void execute(String url) {
// 保存当前窗口
this.preWindow = windowHandler.getWindow();
rec.parseAndRend(url);
}
public void back() {
// 将原窗口再设置回去
windowHandler.setWindow(preWindow);
}
}
/**
* url 具体执行
*/
public class UrlReceiver {
public void parseAndRend(String url) {
// 获取url 对应内容
String content = parse(url);
// 渲染到窗口中
rend(content);
}
private void rend(String content) {
// 渲染窗口
}
}
public class User {
public static void main(String[] args) {
// 在浏览器里用户点击 url
String url = "";
UrlCommand command = new UrlCommand(new UrlReceiver());
command.execute(url);
// 用户点击返回
command.back();
}
}
此处 Command 只能支持单个命令的执行撤销,我们可以写一个 宏命令来封装一串命令执行后的撤销功能
public class MacroUrlCommand implements Command<String> {
private Stack<Command> commands = new Stack<>();
private UrlReceiver receiver;
public MacroUrlCommand(UrlReceiver rec) {
this.receiver = rec;
}
public void execute(String url) {
UrlCommand command = new UrlCommand(receiver);
commands.push(command);
command.execute(url);
}
public void back() {
if(CollectionUtils.isEmpty(commands)) {
return;
}
Command last = commands.pop();
last.back();
}
}
Callback 模式:告知某人操作已经完成,操作结果是什么
观察者模式:通知 n(n>=0) 个观察者某个事件发生
命令模式: 封装对对象的调用,使得命令有一个统一界面,相同命令可以相互转换
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有