命令模式
时间:2022-04-26
本文章向大家介绍命令模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
命令模式定义
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
作用
命令模式主要应用于将行为调用者与实现者解耦。讲发出请求和执行对象分开来。
例如:比如我们以前惯用的写代码的方式是LogicProcess logic = new LogicProcess(); 然后紧接着调用实现方法logic.process(),这种写法其实非常普遍,但这种写法把行为调用者和行为实现者耦合在了一起,一般情况下并没有什么问题的,但当调用逻辑比较复杂或则调用行为有多种实现时就非常不利于程序的扩展。
UML图:
命令模式的参与角色: (1)抽象命令角色(Command):抽象命令,包含命令执行的抽象方法 (2)命令接收者(Receiver):命令接收者角色,它包含所有命令的具体行为实现方法。 (3)具体命令角色(ConcreteCommand):它包含一个命令接收者对象,并调用接收者的对象相应实现方法。 (4)命令调用者角色(Invoker):提供给客户端调用,接收客户端所传递的具体命令对象。
Java代码实现:
抽象命令角色:Command.java
/**
* 抽象命令接口
*/
public interface Command {
void execute();
}
命令接收者角色:Document.java
/**
* 命令接收者 Receiver
*/
public class Document {
public static StringBuffer sbr = new StringBuffer();
public static int count = 0;
public void undo(){
System.out.println("调用撤销实现方法,字符串递减");
sbr.deleteCharAt(sbr.length()-1);
count --;
System.out.println("当前文本为:" + sbr.toString());
}
public void redo(){
System.out.println("调用恢复实现方法,字符串递加");
this.sbr.append(count);
count ++;
System.out.println("当前文本为:" + sbr.toString());
}
public void add(){
System.out.println("调用执行实现方法,字符串递加");
this.sbr.append(count);
count ++;
System.out.println("当前文本为:" + sbr.toString());
}
}
具体命令角色:AddCommand.java
/**
* 执行命令实现类
*/
public class AddCommand implements Command {
public Document doucment;
public AddCommand(Document document){
this.doucment = document;
}
@Override
public void execute() {
this.doucment.add();
}
}
具体命令角色:UndoCommand.java
/**
* 撤销命令实现类
*/
public class UndoCommand implements Command {
public Document doucment;
public UndoCommand(Document document){
this.doucment = document;
}
@Override
public void execute() {
this.doucment.undo();
}
}
具体命令角色:RedoCommand.java
/**
* 恢复命令实现类
*/
public class RedoCommand implements Command {
public Document doucment;
public RedoCommand(Document document){
this.doucment = document;
}
@Override
public void execute() {
this.doucment.redo();
}
}
调用者角色:Invoker.java
public class Invoker {
public Command command;
public void setCommand(Command cmd){
this.command = cmd;
}
public void execute(){
this.command.execute();
}
}
最后可以写一个测试来就知道使用命令模式的好处了
public class TestMain {
public static void main(String args[]){
Document doc = new Document(); //文档实体对象
AddCommand addCmd = new AddCommand(doc); //具体命令实体对象
UndoCommand undoCmd = new UndoCommand(doc); //具体命令实体对象
RedoCommand redoCmd = new RedoCommand(doc); //具体命令实体对象
Invoker invoker = new Invoker(); //调用者对象
invoker.setCommand(addCmd);
invoker.execute();
invoker.setCommand(addCmd);
invoker.execute();
invoker.setCommand(undoCmd);
invoker.execute();
invoker.setCommand(redoCmd);
invoker.execute();
}
}
总结
- 命令模式将发出请求的对象和执行请求的对象解耦
- 在被解耦的两者之间是通过命令对象进行沟通的。命令对象封装了接受者和一个或一组动作。
- 调用者通过命令对象的 execute() 发出请求,这会使得接受者的动作被调用。
- 命令模式可为多种行为提供统一的调用入口,便于程序对行为的管理和控制。
- 命令模式将行为的具体实现封装起来,客户端无需关心行为的具体实现。
- 命令可以支持撤销,做法是实现一个 undo()方法来回到 execute()被执行前的状态。
- 米市的热潮来袭?三枚域名超六位数美金交易
- 微信新出了逆天功能,或许你用得上
- 网站系统架构梳理-解决高负载高并发
- silverlight 相册雏型
- Mysql优化系列(1)--Innodb引擎下mysql自身配置优化
- 一台服务器多实例mysql做主从复制
- spring AOP日志管理
- vue-route+webpack部署单页路由项目,访问刷新出现404问题
- UNIX 高手的 10 个习惯
- linux下截取给定路径中的目录部分
- 一年坎坷也曾怀疑自己,如今五冠在手的柯洁将再战AI
- 从MapX到MapXtreme2004[3]-搜索图元Feature
- git push上传代码到gitlab上,报错401/403(或需要输入用户名和密码)
- mysql下mysqladmin日常管理命令总结
- 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 数组属性和方法
- 微信小程序支付服务端.net core实现,简单直接
- PBE加密 .net 实现
- .net Core 图片验证码 基于SkiaSharp实现
- 解决git/github下载速度缓慢的问题总汇------转
- C语言程序框架注释的一种模板
- Kryo 入门指南
- C# 通过T4自动生成代码
- Netty 主从多线程
- 斐波那契数组-递归和循环实现
- KMP算法 C#实现 字符串查找简单实现
- elasticsearch压力测试工具之ESrally使用说明
- BitMap算法 .net实现 用于去重并且排序,适用于大型权限管理 ,大数据去重排序
- 5.FFMPEG-Qt移植ffmpeg、ffmpeg结构体介绍
- winform总结6=>线程和委托的关系
- winform总结3> 有趣的bat/winform程序完成自己的任务,然后把自己删除