当前位置: 首页 > news >正文

《java与模式》学习系列——命令模式

 

一、命令(Command)模式的结构

命令模式把一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。

命令模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。命令模式类似C语言的回调。因为java不支持函数指针,所以命令模式可以达到同样的目的。

结构图如下图所示:

客户角色代码如下:

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();

}

}

一个具体命令与一个接收者绑定,在具体命令里面调用接收者的处理方法,而客户端的请求可以调用不同的命令对象。如果要增加一个新的命令,只需要增加新的具体命令对象和接收者,而不需要改动客户端代码,客户端也不会察觉。

二、  命令模式在java中的应用

AWT的事件处理

Java语言使用了命令模式处理java.awt库的事件委派处理模型。在这个事件处理模型里面,命令对象实现AWTlistener接口,相当于命令接口。为把一个命令对象与一个AWT构件连接起来,需要把它登记成一个事件的listener。构件认识listener接口,而不在乎接口是怎么实现的。换言之,AWT构件不在意命令所代表实现操作。

三、             命令模式的使用场景

命令模式优缺点

优点:(1)命令模式使新的命令很容易地被加入到系统里(2)允许接收请求的一方决定是否要否决请求(3)能较容易的设计一个命令队列(4)可以容易的实现对请求的UndoRedo5)在需要的情况下,可以较容易地将命令记入日志。

适合的情况

1、使用命令模式作为“回调”在面向对象系统中的替代。“回调”讲的便是先将一个函数登记上,然后在以后调用此函数。

2、需要在不同的时间指定请求、将请求排队。一个命令对象和原先的请求发出者可以有不同的生命期。这时命令的接收者可以是在本地,也可以在网络的另外一个地址。

3、系统需要支持命令的撤消。命令对象可以把状态存储起来,等到客户端需要撤消命令所产生的效果时,可以调用undo()方法撤销。命令对象还可以提供redo()方法,以供客户端在需要时,再重新实施命令的效果。

4、如果一个系统要将系统中所有的数据更新到日志里,以便在系统崩溃时,可以根据日志里读回所有的数据更新命令,重新调用execute()方法一条一条执行这些命令,从而恢复系统在崩溃前所做的数据更新。

5、一人系统需要支持交易(transaction)。一个交易结构封装了一组数据更新命令。使用命令模式实现交易结构可以使系统增加新的交易类型。

四、             命令模式与其他模式的关系

         命令模式与合成模式

合成模式可以应用到命令类的合成上,从几个具体命令类合成宏命令类。可以在任何需要的时候重新把这些记录下来的命令一次性执行,这就是所谓的宏命令集功能。

         备忘录模式

         如果命令需要撤销和恢复功能的话,备忘录模式可以用来存储关于命令的效果状态信息。

五、             Swing库中的命令撤销和恢复

Swingjavax.swing.undo库里提供了撤销和恢复的系统化处理方法。javax.swing.undo库虽然是Swing库的一部分,但它既可以与Swing构件一起使用,又可以与AWT构件一起使用。

每一个命令或操作在Swing里都叫做一个编辑(Edit)。每一个可撤销的命令与操作在Swing里都叫做一个可撤销编辑。

1)接口UndoableEdit。一个类如果需要有撤销和恢复功能的话,就需要实现UndoableEdit接口。

2)抽象类AbstractUndoableEdit是对UndoableEdit接口的最小实现,也是javax.swing.undo库里其他类的基类。

3)接口StateEditable是所有类的可以编辑的类必须实现的接口。

4SateEdit类代表一个可编辑类的状态

5UndoManager类负责管理所有的对一个可编辑类的编辑。

 

 

 

 

 

 

 

 

 

 

 

 

 

相关文章:

  • Windows10中无法打开这个应用的解决方案
  • sqlbulkcopy 使用DataTable作为数据源的数据类型问题--来自数据源的String类型的给定值不能转换为指定目标列的类型 uniqueidentifier...
  • 《java与模式》学习系列——状态模式
  • debian终端菱形乱码修复
  • 《java与模式》学习系列——访问者模式
  • 《java与模式》学习系列——解释器模式
  • C#调用windwos系统数据源配置
  • 《java与模式》学习系列——调停者模式
  • [hibernate]基本值类型映射之日期类型
  • 《java与模式》学习系列——建造者模式
  • 【PL/SQL练习】基本的PL/SQL语句
  • 《java与模式》学习系列——原始模型模式
  • 20145326蔡馨熠《信息安全系统设计基础》第11周学习总结
  • 《java与模式》学习系列——合成模式
  • 【数据结构】简单谈一谈二分法和二叉排序树BST查找的比较
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 230. Kth Smallest Element in a BST
  • css系列之关于字体的事
  • Javascript基础之Array数组API
  • JavaScript设计模式系列一:工厂模式
  • Java的Interrupt与线程中断
  • JS+CSS实现数字滚动
  • React中的“虫洞”——Context
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 好的网址,关于.net 4.0 ,vs 2010
  • 基于Android乐音识别(2)
  • 跨域
  • 力扣(LeetCode)22
  • 如何胜任知名企业的商业数据分析师?
  • 设计模式 开闭原则
  • 微信公众号开发小记——5.python微信红包
  • 写给高年级小学生看的《Bash 指南》
  • mysql面试题分组并合并列
  • 阿里云API、SDK和CLI应用实践方案
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #13 yum、编译安装与sed命令的使用
  • #HarmonyOS:Web组件的使用
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (02)vite环境变量配置
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (C语言)fread与fwrite详解
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (Matlab)使用竞争神经网络实现数据聚类
  • (三)Honghu Cloud云架构一定时调度平台
  • (十六)一篇文章学会Java的常用API
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (一)基于IDEA的JAVA基础12
  • (转)nsfocus-绿盟科技笔试题目
  • (转)ObjectiveC 深浅拷贝学习
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .NET Core 和 .NET Framework 中的 MEF2
  • .NET/C# 的字符串暂存池