设计模式之第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.译为:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。通用类图如下:

图上这么清楚的解释把我想要说的的都说完了,我就不啰嗦了~
命令模式之自我分析
使用我可以达到以下效果:
- 将调用操作的对象与知道如何实现该操作的对象解耦。
- 可以将多个命令装配成一个复合的命令。
- 增加新的命令很容易,无需改变已有的类。
- 类间解耦,调用者角色与接收者之间没有任何依赖关系。
- 可以与我的兄弟职责链模式结合,实现命令族解析任务,与模板方法结合,可以减少命令子类膨胀的问题。
不足:
- 若命令有上千个,就需要有上千个类,类膨胀过于严重,但是可以结合模板方法,减少类的膨胀。
命令模式之实现
那我们就拿老师与小明的故事来实现一下命令模式,首先自然是接收命令的人的抽象类了:
public abstract class Receiver{
//抽象接受者,定义接受者所需要完成的业务
public abstract void out();
}
这里定义了一个抽象类,以及一个抽象方法:出去。
然后是具体的接收者的实现类,可以是小墙、小东、小西等等,这里拿小明举栗子:
public class XiaoMing extends Receiver{
//接受者执行的命令
public void out(){
System.out.println("小明,滚出去。");
}
}
接下来是command的抽象类:
public abstract class Command{
//每个命令执行一个方法
public abstract void execute();
}
之后是具体的Command的实现类:
public class ConcreteCommand extends Command{
//对相应的Receiver类进行命令处理
private Receiver receiver;
//构造函数传递接受者
public ConcreteCommand(Receiver receiver){
this.receiver = receiver;
}
//实现一个命令
public void execute(){
this.receiver.out();
}
}
最后是Invoker类的代码实现:
public class Invoker{
private Command command;
//接收命令
public void setCommand(Command command){
this.command = command;
}
//执行命令
public void action(){
this.commadn.execute();
}
}
经调用之后,就是我们常见的:小明,滚出去了。额,感觉有哪里不对。
命令模式之应用场景
在以下的场景中,可以使用Command模式来实现:
- 不同的时刻、排列和执行请求。
- 支持取消操作。
- 支持修改日志。
- 用构建在原语操作上的高层操作构造一个系统。
以上。预知后式如何,且听下回分解。
PS:本博客欢迎转发,但请注明博客地址及作者~
博客地址:http://www.cnblogs.com/voidy/
博客新址:http://voidy.net
<。)#)))≦
设计模式之第14章-命令模式(Java实现)的更多相关文章
- 第14章 命令模式(Command Pattern)
原文 第14章 命令模式(Command Pattern) 命令模式(Command Pattern) 概述 在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”.但在某些场合,比如 ...
- 设计模式之第7章-外观模式(Java实现)
设计模式之第7章-外观模式(Java实现) “鱼哥,知道怎么把大象装进冰箱里面么?”(作者按:这么简单的问题还想考我,早了几百年吧.)“把大象装进冰箱里,一共需要三步:第一步,把冰箱门打开:第二步,把 ...
- 设计模式之第22章-组合模式(Java实现)
设计模式之第22章-组合模式(Java实现) “鱼哥,有没有什么模式是用来处理树形的“部分与整体”的层次结构的啊.”“当然”“没有?”“有啊.别急,一会人就到了.” 组合模式之自我介绍 “请问你是?怎 ...
- 设计模式之第21章-状态模式(Java实现)
设计模式之第21章-状态模式(Java实现) “what are you 干啥了?怎么这么萎靡不振?”“昨晚又是补新番,又是补小笼包,睡得有点晚啊.话说杨过的那个雕兄真是太好了,每天给找蛇胆,又陪练武 ...
- 设计模式之第20章-访问者模式(Java实现)
设计模式之第20章-访问者模式(Java实现) “嘿,你脸好红啊.”“精神焕发.”“怎么又黄了?”“怕冷,涂的,涂的,蜡.”“身上还有酒味,露馅了吧,原来是喝酒喝的啊.”“嘿嘿,让,让你发现了,今天来 ...
- 设计模式之第17章-备忘录模式(Java实现)
设计模式之第17章-备忘录模式(Java实现) 好男人就是我,我就是曾小贤.最近陈赫和张子萱事件闹得那是一个沸沸扬扬.想想曾经每年都有爱情公寓陪伴的我现如今过年没有了爱情公寓总是感觉缺少点什么.不知道 ...
- 设计模式之第16章-代理模式(Java实现)
设计模式之第16章-代理模式(Java实现) “现在朋友圈真是太让人蛋疼了啊.”“怎么说?”“一堆代理,各种卖东西的,看着好烦人.”“哎,删了呗.”“都是朋友,哪里好意思删啊.”“这倒也是...哎,迫 ...
- 设计模式之第11章-建造者模式(Java实现)
设计模式之第11章-建造者模式(Java实现) “那个餐厅我也是醉了...”“怎么了?”“上菜顺序啊,竟然先上甜品,然后是冷饮,再然后才是菜什么的,无语死了.”“这个顺序也有人这么点的啊.不过很少就是 ...
- 设计模式之第10章-桥接模式(Java实现)
设计模式之第10章-桥接模式(Java实现) “一入软件深似海,从此早睡是路人.黑夜给了我黑色的眼睛,我却用他去寻找八阿哥.”“怎么了,又来那么多的感慨啊.”“还能有什么啊,老板是说让换个APP做,这 ...
随机推荐
- WPF学习一:XAML的资源(Resources)结构
一个初学者,把知识做个积累,如果有不对的地方,还请高手指出,谢谢! 先看一段代码:(下面是以Window WPF进行讲解,如果是Web 的话就把<Window改为<Page 而如果是 Us ...
- NEO
平台: Windows 类型: 虚拟机镜像 软件包: .net core neo application server basic software blockchain neo open sourc ...
- arcgis api for js 地图查询
arcgis api for js入门开发系列四地图查询(含源代码) 上一篇实现了demo的地图工具栏,本篇新增地图查询功能,包括属性查询和空间查询两大块,截图如下: 属性查询效果图: 空间查询效 ...
- SQL中如何避免书签查找
1.使用聚集索引 对于聚集索引,索引的叶子页面和表的数据页面相同.因此,当读取聚集索引键列的值时,数据引擎可以读取其他列的值而不需要任何导航.例如前面的区间数据查询的操作,SQLServer通过B树结 ...
- cms-写帖子内容实现
写帖子后台: mapper: <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperP ...
- EF写统计
EF的特性是,你from的第一个表为主表,接下来的所有表以左联或者内联或者交叉连接的方式去显示,不会出现右联, 在编写的时候,可以先确定个数据源,然后对这个数据源进行数据的统计, 例如SQL: -- ...
- POJ 3281 Dining(网络流最大匹配)
分析: 数学模型是三个集合A,B,C,(a,b,c)构成一个匹配.因为图一个点只能匹配一次,把a拆点a',a", 在可以匹配的点上连边,s - b - a' - a" - c - ...
- PAT (Advanced Level) Practise - 1093. Count PAT's (25)
http://www.patest.cn/contests/pat-a-practise/1093 The string APPAPT contains two PAT's as substrings ...
- CUDA入门需要知道的东西
CUDA刚学习不久,做毕业要用,也没时间研究太多的东西,我的博客里有一些我自己看过的东西,不敢保证都特别有用,但是至少对刚入门的朋友或多或少希望对大家有一点帮助吧,若果你是大牛请指针不对的地方,如果你 ...
- 解决使用Application Loader上传ipa提示“上传appstore失败”
试了好多次使用Application Loader上传ipa,一直提示上传失败,用其他mac电脑却可以,那就是环境有问题,笔者试过重装xcode,都无法解决问题, 查看日志类似是jdk版本问题,换了所 ...