设计模式~命令模式
时间:2022-07-24
本文章向大家介绍设计模式~命令模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
命令模式(Command)属于对象的行为模式。
命令模式又称为行动模式(Action)或交易模式(Transaction)。
命令模式把一个请求或者操作封装到一个对象中。
命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。
命令模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。
命令模式的结构
命令模式涉及五个角色:
- 客户角色(Client): 创建一个具体命令对象(ConcreteCommand)并确定其接收者。
- 命令角色(Command): 声明了一个给所有具体命令类的抽象接口。
- 具体命令角色(ConcreteCommand): 定义一个接收者和行为之间的弱耦合;实现execute()方法,负责调用接收者的相应操作。execute()方法通常叫做执行方法。
- 请求者角色(Invoker): 负责调用命令对象执行请求,相关的方法叫做行动方法。
- 接收者角色(Receiver): 负责具体实施和执行一个请求。任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法。
源代码:
客户端角色
public class Client {
public static void main(String[] args) {
Receiver receiver = new Receiver();
Command command = new ConcreteCommand(receiver);
Invoker invoker = new Invoker(command);
invoker.action();
}
}
请求者(Invoker)
public class Invoker {
private Command command;
//构造函数
public Invoker(Command command){
this.command = command;
}
//行动方法
public void action(){
command.execute();
}
}
接收者(Receiver)
public class Receiver {
//构造函数
public Receiver(){
//write code here
}
//行动方法
public void action(){
System.out.println("Action has been taken.");
}
}
抽象命令角色
public interface Command {
//执行方法
void execute();
}
具体命令类
public class ConcreteCommand implements Command {
private Receiver receiver;
public ConcreteCommand(Receiver receiver){
this.receiver = receiver;
}
@Override
public void execute() {
receiver.action();
}
}
命令模式的活动序列
命令模式的活动序列:
1. 客户端创建了一个ConcreteCommand对象,并指明了接收者。
2. 请求者对象保存了ConcreteCommand对象
3. 请求者对象通过调用action方法发出请求。如果命令时能撤销的,那么ConcreteCommand保存了调用execute()方法之前的状态。
4. ConcreteCommand对象调用接收的一方的方法执行请求。
在什么情况下使用命令模式
- 使用命令模式作为回呼在面向对象系统中的替代。回呼讲的便是先将一个函数登记上,然后在以后调用此函数。
- 需要在不同的时间指定请求、将请求排队。一个命令对象和原先的请求发出者可以有不同的生命期。
- 系统需要支持命令的撤销。命令对象可以把状态存储起来,等到客户端需要撤销命令所产生的效果时,可以调用undo()方法,把命令所产生的效果撤销掉。
- 如果一个系统要将系统中所有的数据更新到日志里,以便在系统崩溃时,可以根据日志里读回所有的数据更新命令,重新调用execute() 方法一条一条的执行这些命令,从而恢复系统在崩溃前所做的数据更新。
- 一个系统需要支持交易(transaction)。一个交易结构封装了一组数据更新命令。使用命令模式来实现交易结构可以使系统增加新的交易类型。
使用命令模式的优点和缺点
优点:
- 命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分割开。
- 命令类与其他任何别的类一样,可以修改和推广。
- 你可以把命令对象聚合在一起,合成合成模式。
- 由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易。
缺点:
- 使用命令模式会导致某些系统有过多的具体命令类。
- 经典算法学习之分治法(以排列、组合程序为例)
- Bash概论 - Linux系列教程补充篇
- 我母亲遭遇勒索软件CryptoWall的全过程
- Android浏览器跨域数据窃取和Intent Scheme攻击
- 关于React Native项目在android上UI性能调试实践
- 一文读懂如何用 Python 实现6种排序算法
- 三星KNOX远程静默安装漏洞深入分析报告
- 技术分享:MSSQL注入xp_cmdshell
- 通过5个简单序列预测实例学习LSTM递归神经网络
- Google发现Windows 8.1 0day漏洞并公布漏洞验证程序(PoC)
- 携程React Native实践
- 数据分析告诉你:Php最不安全,Nginx比Apache安全
- 用python抓取摩拜单车API数据并做可视化分析(源码)
- 用Pandas在Python中可视化机器学习数据
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- NuGet 使用自定义本地类库目录
- Flutter/Dart中的异步编程之Isolate
- System.Net.Http for Silverlight
- 在SAP WebClient UI里混用ABAP Webdynpro,会带来哪些问题?
- 设计模式之中介者模式
- SAP WebClient UI创建Value help最详细的步骤
- 设计模式之迭代器模式
- 跨平台开发框架 MvvmCross 初体验
- 设计模式之解释器模式
- 设计模式之命令模式
- 设计模式之职责链模式
- iOS 静态类库项目的创建与使用
- 使用ABAP创建QR Code(二维码)
- CocoaTouch 中的 NSString
- 在 iOS 项目中使用 ESRI ArcGIS SDK