设计模式之第14章-命令行模式(Java实现)

设计模式之第14章-命令模式(Java实现)

  “小明,滚出去。”“小明,这个问题怎么做?”(可怜的小明无奈躺枪。小明:老师,我和你有什么仇什么怨,我和你有什么仇什么怨啊到底、、、老师:小明,滚出去。习惯了而已。小明:、、、)对于这种现象,有请命令模式来做一下解说。

命令模式之自我介绍

  知道高内聚么?不知道吧,其实我也不知道。(作者按:某模式开启装逼模式,装逼模式正在开启中、、、开启失败,回滚。)所以让作者大大给我们科普一下(苦命的我啊~),所谓高内聚是软件工程的一个概念,主要是面向对象的设计,说的是类与类的关系,所谓高内聚就是说一个模块内各个元素结合的紧密程度比较高。高内聚就是很好符合了单一职责的设计原则。好了,科普结束,觅食去了。恩恩,鱼哥说的就是我想说的,而我就是一个高内聚的模式。定义是:Encapsulate a request as an object ,thereby letting you parameterize clients with different requests, queue or log requests, and support undoable operations.译为:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。通用类图如下:

  图上这么清楚的解释把我想要说的的都说完了,我就不啰嗦了~

命令模式之自我分析

  使用我可以达到以下效果:

  • 将调用操作的对象与知道如何实现该操作的对象解耦。
  • 可以将多个命令装配成一个复合的命令。
  • 增加新的命令很容易,无需改变已有的类。
  • 类间解耦,调用者角色与接收者之间没有任何依赖关系。
  • 可以与我的兄弟职责链模式结合,实现命令族解析任务,与模板方法结合,可以减少命令子类膨胀的问题。

  不足:

  • 若命令有上千个,就需要有上千个类,类膨胀过于严重,但是可以结合模板方法,减少类的膨胀。

命令模式之实现

  那我们就拿老师与小明的故事来实现一下命令模式,首先自然是接收命令的人的抽象类了:

1 public abstract class Receiver{
2     //抽象接受者,定义接受者所需要完成的业务
3     public abstract void out();
4
5 }

  这里定义了一个抽象类,以及一个抽象方法:出去。

   然后是具体的接收者的实现类,可以是小墙、小东、小西等等,这里拿小明举栗子:

1 public class XiaoMing extends Receiver{
2     //接受者执行的命令
3     public void out(){
4         System.out.println("小明,滚出去。");
5     }
6 }

  接下来是command的抽象类:

1 public abstract class Command{
2     //每个命令执行一个方法
3     public abstract void execute();
4 }

 之后是具体的Command的实现类:

 1 public class ConcreteCommand extends Command{
 2     //对相应的Receiver类进行命令处理
 3     private Receiver receiver;
 4     //构造函数传递接受者
 5     public ConcreteCommand(Receiver receiver){
 6         this.receiver = receiver;
 7     }
 8
 9     //实现一个命令
10     public void execute(){
11         this.receiver.out();
12     }
13 }

  最后是Invoker类的代码实现:

 1 public class Invoker{
 2     private Command command;
 3     //接收命令
 4
 5     public void setCommand(Command command){
 6         this.command = command;
 7     }
 8
 9     //执行命令
10     public void action(){
11         this.commadn.execute();
12     }
13 }

  经调用之后,就是我们常见的:小明,滚出去了。额,感觉有哪里不对。

命令模式之应用场景

  在以下的场景中,可以使用Command模式来实现:

  • 不同的时刻、排列和执行请求。
  • 支持取消操作。
  • 支持修改日志。
  • 用构建在原语操作上的高层操作构造一个系统。

  以上。预知后式如何,且听下回分解。

  PS:本博客欢迎转发,但请注明博客地址及作者~

  博客地址:http://www.cnblogs.com/voidy/

  博客新址:http://voidy.gitcafe.com

  <。)#)))≦

时间: 2024-11-06 07:17:23

设计模式之第14章-命令行模式(Java实现)的相关文章

设计模式之第19章-中介者模式(Java实现)

设计模式之第19章-中介者模式(Java实现) “测试妹纸找你,你的代码出问题了.”“美工妹纸让你看看界面怎么样.”身为程序员总要和各种人打交道,但是如果再分为前端.后端工程师的话,那么关系就会错综复杂起来了,这个时候如果有中介者进行中转,类似于星型网络拓扑的交换机,那么该有多好.(PS:注孤生啊,和测试妹纸.美工妹纸什么的一起讨论增进感情多好,那么好的机会都不珍惜.编者按:我是要做那个中介者,懂么?中介者!众人:good job!)“鱼哥,叫我干嘛?”真是说曹操曹操到,刚刚正说你来着,行了,你

设计模式之第12章-享元模式(Java实现)

设计模式之第12章-享元模式(Java实现) “怎么回事,竟然出现了OutOfMemory的错误.鱼哥,来帮我看看啊.”“有跟踪错误原因么?是内存泄露么?”“不是内存泄露啊,具体原因不知道啊.对了,有说新对象申请不到内存空间.”“这个原因么,我曾写过一篇博文:叫OutOfMemory简单分析.不过你的明显是因为代码问题,产生对象太多,导致内存被耗尽,正好一会有堂课,讲的正好能解决你的问题.”(嘿嘿,轮到我享元模式出场了~) 享元模式之自我介绍 我,享元模式乃是池技术中的重要实现方式,具体定义如下

设计模式之第1章-工厂方法模式(Java实现)

设计模式之第1章-工厂方法模式(Java实现) “我先来”,“不,老公,我先!”.远远的就听到几个人,哦不,是工厂方法模式和抽象工厂模式俩小夫妻在争吵,尼妹,又不是吃东西,谁先来不都一样(吃货的世界~).“抽象工厂模式,赶紧的自我介绍,工厂方法模式,你身为男人,要懂得绅士风度,lady first懂不懂,稍后再来,急什么.”(画外音:鱼哥,这是我家祖传的小吃,还有我爹的好酒blablabla),“哎呀,那个抽象工厂模式,阿姨喊你回家吃饭了.”“哦,我去去就回,等我啊.”工厂方法,赶紧的.“等等,

设计模式之(Command)命令行模式

1.需求 为一个开关设计程序,这个开关有N按钮,同时对应N个插槽,要求可以接入任何电器厂商的API,从而可以控制任何电器.目前只有电灯和电视两种电器,要求写一个Demo程序,按钮1可以打开电灯.按钮2可以打开电视并且切换到上一次打开的频道.打开电视换频道需要打开机顶盒并且对机顶盒切换频道. 2. 分析 每个厂商的API不一致,且每个电器的打开流程都不一样,我们需要将这些差异封装起来,才可以实现新增电器时不需要修改开关程序. 3. 类图 4. 总结 上面的例子主要通过Command模式将执运算块(

第14章 命令模式(Command Pattern)

原文 第14章 命令模式(Command Pattern) 命令模式(Command Pattern) 概述   在软件系统中,"行为请求者"与"行为实现者"通常呈现一种"紧耦合".但在某些场合,比如要对行为进行"记录.撤销/重做.事务"等处理,这种无法抵御变化的紧耦合是不合适的.在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合[李建

好压(HaoZip)的命令行模式用法介绍

好压压缩软件,又叫“2345好压”,是一款国产的优秀压缩软件,目前是免费的,据官网介绍,该软件永久免费.官网地址:http://haozip.2345.com/ 本文主要对该软件的命令行模式用法进行介绍.目前,压缩软件支持命令行模式的还有winrar,一款国外的优秀老牌压缩软件,winrar的命令行模式请参考我的另一篇博客: WinRAR的命令行模式用法介绍 - Fetty - 博客园  http://www.cnblogs.com/fetty/p/4769279.html 直接奉上我的测试代码

jmeter命令行模式运行,实时获取压测结果

jmeter命令行模式运行,实时获取压测结果 jmeter很小,很快,使用方便,可以在界面运行,可以命令行运行.简单介绍下命令行运行的方式: sh jmeter.sh -n -t my-script.jmx -R 10.6.5.31,10.6.5.35,10.6.5.36,10.6.5.37,10.6.5.72 -l 8.jtl 上面一条命令应该可以满足大部分需求. -n:使用命令行模式运行 -t:指定要运行的jmx脚本 -R:指定使用那些slave节点压测 -l:压测记录保存在哪里 使用-R指

PHP 的命令行模式

PHP 的命令行模式 从版本 4.3.0 开始,PHP 提供了一种新类型的 SAPI(Server Application Programming Interface,服务端应用编程端口)支持,名为 CLI,意为 Command Line Interface,即命令行接口.顾名思义,该 SAPI 模块主要用作 PHP 的开发外壳应用.CLI SAPI 和其它 SAPI 模块相比有很多的不同之处,我们将在本章中详细阐述.值得一提的是,CLI和 CGI 是不同的 SAPI,尽管它们之间有很多共同的行

WinRAR的命令行模式用法介绍

因工作中要对数据打包,顺便研究了下WinRAR的命令行模式,自己写了些例子,基本用法如下: 测试压缩文件准备:文件夹test_data,内部包含子文件夹,分别存放了一些*.log和*.txt文件. 测试代码如下: 1 rem 压缩全部文件,按类型压缩,zip打包 2 WinRAR.exe a num_all.zip .\test_data 3 WinRAR.exe a num_txt.zip .\test_data\num*.txt 4 WinRAR.exe a num_log.zip .\te