设计模式~命令模式
时间: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)。一个交易结构封装了一组数据更新命令。使用命令模式来实现交易结构可以使系统增加新的交易类型。
使用命令模式的优点和缺点
优点:
- 命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分割开。
- 命令类与其他任何别的类一样,可以修改和推广。
- 你可以把命令对象聚合在一起,合成合成模式。
- 由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易。
缺点:
- 使用命令模式会导致某些系统有过多的具体命令类。
- 【入门篇】Jetson TX2深度学习Inference初体验
- zeromq的安装,部署(号称最快的消息队列,消息中间件)
- OpenDaylight新建HelloWorld工程并集成版本
- 摸索出来的chrom调试前后台数据(Java&&Ajax)交互的方法分享一下咯!!!
- 机器学习:单词拼写纠正器python实现
- java.lang.Exception: 资源处理失败,失败原因:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown
- Server Tomcat v7.0 Server at localhost failed to start.
- Ovs+Dpdk简单实践
- Spark入门,概述,部署,以及学习(Spark是一种快速、通用、可扩展的大数据分析引擎)
- 创建基于MailKit和MimeKit的.NET基础邮件服务
- 把一个矩阵行优先展成一个向量,numpy.ravel() vs numpy.flatten()区别
- dataframe插入数据报错SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a
- python 对矩阵进行复制操作 np.repeat 与 np.tile区别
- 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 数组属性和方法