文档章节

java设计模式——命令模式

MYangM
 MYangM
发布于 2017/06/02 16:24
字数 1280
阅读 1
收藏 0
点赞 0
评论 0

命令模式属于23种设计模式中行为模式中的一个,它也是一种简单实用非常普遍的设计模式。
首先看下GOF对命令模式的定义:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
命令模式主要应用于将行为调用者与实现者解耦。比如我们以前惯用的写代码的方式是LogicProcess logic = new LogicProcess();  然后紧接着调用实现方法logic.process(),这种写法其实非常普遍,但这种写法把行为调用者和行为实现者耦合在了一起,一般情况下并没有什么问题的,但当调用逻辑比较复杂或则调用行为有多种实现时就非常不利于程序的扩展。
命令模式的适用场景描述:
(1)整个调用过程比较繁杂,或者存在多处这种调用。使用Command类对该调用加以封装,便于功能的再利用。
(2)调用前后需要对调用参数进行某些处理。
(3)调用前后需要进行某些额外处理,比如日志,缓存,记录历史操作等。
命令模式结构图如下:

命令模式的参与角色:
(1)抽象命令角色(Command):抽象命令,包含命令执行的抽象方法
(2)命令接收者(Receiver):命令接收者角色,它包含所有命令的具体行为实现方法。
(3)具体命令角色(ConcreteCommand):它包含一个命令接收者对象,并调用接收者的对象相应实现方法。
(4)命令调用者角色(Invoker):提供给客户端调用,接收客户端所传递的具体命令对象。
下面看具体代码实现:
1、第一个文件抽象命令角色:Command.java

点击(此处)折叠或打开

  1. /**
  2.  * 抽象命令接口
  3.  */
  4. public interface Command {
  5.     /**
  6.      * 命令执行方法
  7.      */
  8.     public void execute();
  9. }

2、第二个文件命令接收者角色:Document.java

点击(此处)折叠或打开

  1. /**
  2.  * 命令接收者 Receiver
  3.  */
  4. public class Document {
  5.  
  6.     /**
  7.      * 操作实体对象
  8.      */
  9.     public static StringBuffer sbr = new StringBuffer();
  10.     
  11.     /**
  12.      * 计数器
  13.      */
  14.     public static int count = 0;
  15.     
  16.     /**
  17.      * 撤销实现方法
  18.      */
  19.     public void undo(){
  20.         System.out.println("调用撤销实现方法,字符串递减");
  21.         sbr.deleteCharAt(sbr.length()-1);
  22.         count --;
  23.         System.out.println("当前文本为:" + sbr.toString());
  24.     }
  25.     
  26.     /**
  27.      * 恢复实现方法
  28.      */
  29.     public void redo(){
  30.         System.out.println("调用恢复实现方法,字符串递加");
  31.         this.sbr.append(count);
  32.         count ++;
  33.         System.out.println("当前文本为:" + sbr.toString());
  34.     }
  35.     
  36.     /**
  37.      * 执行实现方法
  38.      */
  39.     public void add(){
  40.         System.out.println("调用执行实现方法,字符串递加");
  41.         this.sbr.append(count);
  42.         count ++;
  43.         System.out.println("当前文本为:" + sbr.toString());
  44.     }
  45. }

3、第三个文件具体命令角色:AddCommand.java

点击(此处)折叠或打开

  1. /**
  2.  * 执行命令实现类
  3.  */
  4. public class AddCommand implements Command {
  5.  
  6.     /**
  7.      * 命令接受者对象
  8.      */
  9.     public Document doucment;
  10.     
  11.     /**
  12.      * 构造方法
  13.      * @param document
  14.      */
  15.     public AddCommand(Document document){
  16.         this.doucment = document;
  17.     }
  18.     
  19.     @Override
  20.     public void execute() {
  21.         // TODO Auto-generated method stub
  22.         this.doucment.add();
  23.     }
  24. }

4、第四个文件具体命令角色:UndoCommand.java

点击(此处)折叠或打开

  1. /**
  2.  * 撤销命令实现类
  3.  */
  4. public class UndoCommand implements Command {
  5.  
  6.     /**
  7.      * 命令接受者对象
  8.      */
  9.     public Document doucment;
  10.     
  11.     /**
  12.      * 构造方法
  13.      * @param document
  14.      */
  15.     public UndoCommand(Document document){
  16.         this.doucment = document;
  17.     }
  18.     
  19.     @Override
  20.     public void execute() {
  21.         // TODO Auto-generated method stub
  22.         this.doucment.undo();
  23.     }
  24. }

5、第五个文件具体命令角色:RedoCommand.java

点击(此处)折叠或打开

  1. /**
  2.  * 恢复命令实现类
  3.  */
  4. public class RedoCommand implements Command {
  5.  
  6.     /**
  7.      * 命令接受者对象
  8.      */
  9.     public Document doucment;
  10.     
  11.     /**
  12.      * 构造方法
  13.      * @param document
  14.      */
  15.     public RedoCommand(Document document){
  16.         this.doucment = document;
  17.     }
  18.     
  19.     @Override
  20.     public void execute() {
  21.         // TODO Auto-generated method stub
  22.         this.doucment.redo();
  23.     }
  24.  
  25. }

6、第六个文件调用者角色:Invoker.java

点击(此处)折叠或打开

  1. /**
  2.  * 提供给客户端的命令调用方法
  3.  * @author feng
  4.  *
  5.  */
  6. public class Invoker {
  7.  
  8.     /**
  9.      * 命令对象
  10.      */
  11.     public Command command;
  12.     
  13.     /**
  14.      * 命令设置方法
  15.      * @param command
  16.      */
  17.     public void setCommand(Command cmd){
  18.         this.command = cmd;
  19.     }
  20.     
  21.     /**
  22.      * 命令执行方法
  23.      */
  24.     public void execute(){
  25.         this.command.execute();
  26.     }
  27. }

7、第七个文件TestMain.java

点击(此处)折叠或打开

  1. /**
  2.  * 测试Main方法
  3.  */
  4. public class TestMain {
  5.  
  6.     public static void main(String args[]){
  7.         Document doc = new Document(); //文档实体对象
  8.         AddCommand addCmd = new AddCommand(doc); //具体命令实体对象
  9.         UndoCommand undoCmd = new UndoCommand(doc); //具体命令实体对象
  10.         RedoCommand redoCmd = new RedoCommand(doc); //具体命令实体对象
  11.         Invoker invoker = new Invoker(); //调用者对象
  12.         invoker.setCommand(addCmd);
  13.         invoker.execute();
  14.         invoker.setCommand(addCmd);
  15.         invoker.execute();
  16.         invoker.setCommand(undoCmd);
  17.         invoker.execute();
  18.         invoker.setCommand(redoCmd);
  19.         invoker.execute();
  20.     }
  21. }

虽然代码看似挺多,但其实命令模式的结构还是比较清晰的,总的来说命令模式的使用流程就是首先创建一个抽象命令,然后创建多个具体命令实现抽象命令接口,然后创建一个命令接受者角色,它包含各种的行为的具体实现,然后再有一个命令调用者角色,提供给客户端,用于接收客户端的参数。
下面总结下命令模式的优点:
(1)命令模式将行为调用者和各种行为分隔开,降低程序的耦合,便于程序扩展。
(2)命令模式将行为的具体实现封装起来,客户端无需关心行为的具体实现。
(3)命令模式可为多种行为提供统一的调用入口,便于程序对行为的管理和控制。

本文转载自:http://blog.chinaunix.net/uid-29140694-id-4134135.html

共有 人打赏支持
MYangM
粉丝 0
博文 28
码字总数 1656
作品 0
闵行
简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

转载:原地址http://www.cnblogs.com/zhangchenliang/p/3700820.html 简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别 结合简单示例和UML图,讲解工厂模式简单原理。 一、引子 话说...

法斗斗 ⋅ 05/08 ⋅ 0

Java 设计模式(14) —— 复合模式

一、复合模式 模式常一起使用,组合在一个设计解决方案中 复合模式在一个解决方案中结合两个或多个模式,能解决一般性或一系列的问题 二、示例 本次设计模式讲解中无代码示例,由于复合模式是...

磊_lei ⋅ 05/26 ⋅ 0

java开发中的常用的设计模式

设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代...

qq_38024548 ⋅ 05/28 ⋅ 0

为什么我墙裂建议大家使用枚举来实现单例。

关于单例模式,我的博客中有很多文章介绍过。作为23种设计模式中最为常用的设计模式,单例模式并没有想象的那么简单。因为在设计单例的时候要考虑很多问题,比如线程安全问题、序列化对单例的...

⋅ 06/10 ⋅ 0

Java 设计模式 之 单例模式 Singleton 实际应用

Java 设计模式 之 单例模式 Singleton 实际应用 http://www.verejava.com/?id=16998954233354

verejava ⋅ 05/24 ⋅ 0

代理模式(Proxy Pattern):动态代理 - 最易懂的设计模式解析

前言 今天我来全面总结开发中最常用的设计模式 - 代理模式中的动态代理模式 其他设计模式介绍 1分钟全面了解“设计模式” 单例模式(Singleton) - 最易懂的设计模式解析 简单工厂模式(Sim...

Carson_Ho ⋅ 04/09 ⋅ 0

【唯品会】设计模式在特卖会的应用与思考

设计模式在特卖会的应用与思考 无心之心,道之所存 --《建筑的永恒之道》 1、开篇 之所以讨论设计模式,是因为当前我们都明白它可以提供优雅的解决方案,有利于在团队项目中建立共识,并且无...

暗夜在火星 ⋅ 2016/11/12 ⋅ 0

Java篇-接口interface关键字

一 : interface关键字 接口是与类并行的一个概念 Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,...

TianTianBaby223 ⋅ 04/24 ⋅ 0

详解Proxy代理模式的场景分析

代理模式是一个十分优秀的软件架构模式,许多应用都用到了代理模式。代理模式就是为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不合适或者不能直接引用另一个对象,...

Java架构 ⋅ 05/30 ⋅ 0

你需要了解的23种JavaScript设计模式

为什么要学习设计模式? 在许多访谈中,你可能会遇到很多面向对象编程中的接口,抽象类,代理和以及其他与设计模式相关的问题。 一旦了解了设计模式,它会让你轻松应对任何访谈,并可以在你的...

java高级架构牛人 ⋅ 06/02 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

6.1 压缩打包介绍 6.2 gzip压缩工具 6.3 bzip2压缩工具 6.4 xz压缩工具

压缩打包介绍 使用压缩工具的好处: 使用压缩文件,不仅可以节省磁盘空间,而且在传输时还能节省网络宽带。 我们通常讲的家用宽带和机房宽带100M是有区别的: 机房宽带的上行和下行都是100M,...

Linux_老吴 ⋅ 21分钟前 ⋅ 0

SpringBoot热部署加持

概述 进行SpringBoot的Web开发过程中,我们很多时候经常需要重启Web服务器才能保证修改的 源代码文件、或者一些诸如xml的配置文件、以及一些静态文件生效,这样耗时又低效。所谓的热部署指的...

CodeSheep ⋅ 28分钟前 ⋅ 0

OSChina 周六乱弹 —— 假如你被熊困到树上

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小小编辑:推荐歌曲《如果写不出好的和弦就该在洒满阳光的钢琴前一起吃布丁》 《如果写不出好的和弦就该在洒满阳光的钢琴前一起吃布丁》- 谢...

小小编辑 ⋅ 59分钟前 ⋅ 5

vbs 取文件大小 字节

dim namedim fs, s'name = Inputbox("姓名")'msgbox(name)set fs = wscript.createobject("scripting.filesystemobject") 'fs为FSO实例if (fs.folderexists("c:\temp"))......

vga ⋅ 今天 ⋅ 1

高并发之Nginx的限流

首先Nginx的版本号有要求,最低为1.11.5 如果低于这个版本,在Nginx的配置中 upstream web_app { server 到达Ip1:端口 max_conns=10; server 到达Ip2:端口 max_conns=10; } server { listen ...

算法之名 ⋅ 今天 ⋅ 0

Spring | IOC AOP 注解 简单使用

写在前面的话 很久没更新笔记了,有人会抱怨:小冯啊,你是不是在偷懒啊,没有学习了。老哥,真的冤枉:我觉得我自己很菜,还在努力学习呢,正在学习Vue.js做管理系统呢。即便这样,我还是不...

Wenyi_Feng ⋅ 今天 ⋅ 0

博客迁移到 https://www.jianshu.com/u/aa501451a235

博客迁移到 https://www.jianshu.com/u/aa501451a235 本博客不再更新

为为02 ⋅ 今天 ⋅ 0

win10怎么彻底关闭自动更新

win10自带的更新每天都很多,每一次下载都要占用大量网络,而且安装要等得时间也蛮久的。 工具/原料 Win10 方法/步骤 单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”...

阿K1225 ⋅ 今天 ⋅ 0

Elasticsearch 6.3.0 SQL功能使用案例分享

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3.0 官方新推出的SQL检索插件非常不错,本文一个实际案例来介绍其使用方法。 1.代码中的sql检索 @Testpu...

bboss ⋅ 今天 ⋅ 0

informix数据库在linux中的安装以及用java/c/c++访问

一、安装前准备 安装JDK(略) 到IBM官网上下载informix软件:iif.12.10.FC9DE.linux-x86_64.tar放在某个大家都可以访问的目录比如:/mypkg,并解压到该目录下。 我也放到了百度云和天翼云上...

wangxuwei ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部