设计模式《JAVA与模式》之命令模式
在阎宏博士的《JAVA与模式》一书中开头是这样描述命令(Command)模式的:
命令模式属于对象的行为模式。命令模式又称为行动(Action)模式或交易(Transaction)模式。
命令模式把一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。
命令模式的结构
命令模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。
每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行操作。命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。
命令允许请求的一方和接收请求的一方能够独立演化,从而具有以下的优点:
(1)命令模式使新的命令很容易地被加入到系统里。
(2)允许接收请求的一方决定是否要否决请求。
(3)能较容易地设计一个命令队列。
(4)可以容易地实现对请求的撤销和恢复。
(5)在需要的情况下,可以较容易地将命令记入日志。
下面以一个示意性的系统,说明命令模式的结构。
命令模式涉及到五个角色,它们分别是:
● 客户端(Client)角色:创建一个具体命令(ConcreteCommand)对象并确定其接收者。
● 命令(Command)角色:声明了一个给所有具体命令类的抽象接口。
● 具体命令(ConcreteCommand)角色:定义一个接收者和行为之间的弱耦合;实现execute()方法,负责调用接收者的相应操作。execute()方法通常叫做执行方法。
● 请求者(Invoker)角色:负责调用命令对象执行请求,相关的方法叫做行动方法。
● 接收者(Receiver)角色:负责具体实施和执行一个请求。任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法。
源代码
接收者角色类
public class Receiver {
/**
* 真正执行命令相应的操作
*/
public void action(){
System.out.println("执行操作");
}
}
抽象命令角色类
public interface Command {
/**
* 执行方法
*/
void execute();
}
具体命令角色类
public class ConcreteCommand implements Command {
//持有相应的接收者对象
private Receiver receiver = null;
/**
* 构造方法
*/
public ConcreteCommand(Receiver receiver){
this.receiver = receiver;
}
@Override
public void execute() {
//通常会转调接收者对象的相应方法,让接收者来真正执行功能
receiver.action();
} }
请求者角色类
public class Invoker {
/**
* 持有命令对象
*/
private Command command = null;
/**
* 构造方法
*/
public Invoker(Command command){
this.command = command;
}
/**
* 行动方法
*/
public void action(){ command.execute();
}
}
客户端角色类
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();
} }
AudioPlayer系统
小女孩茱丽(Julia)有一个盒式录音机,此录音机有播音(Play)、倒带(Rewind)和停止(Stop)功能,录音机的键盘便是请求者(Invoker)角色;茱丽(Julia)是客户端角色,而录音机便是接收者角色。Command类扮演抽象命令角色,而PlayCommand、StopCommand和RewindCommand便是具体命令类。茱丽(Julia)不需要知道播音(play)、倒带(rewind)和停止(stop)功能是怎么具体执行的,这些命令执行的细节全都由键盘(Keypad)具体实施。茱丽(Julia)只需要在键盘上按下相应的键便可以了。
录音机是典型的命令模式。录音机按键把客户端与录音机的操作细节分割开来。
源代码
接收者角色,由录音机类扮演
public class AudioPlayer { public void play(){
System.out.println("播放...");
} public void rewind(){
System.out.println("倒带...");
} public void stop(){
System.out.println("停止...");
}
}
抽象命令角色类
public interface Command {
/**
* 执行方法
*/
public void execute();
}
具体命令角色类
public class PlayCommand implements Command { private AudioPlayer myAudio; public PlayCommand(AudioPlayer audioPlayer){
myAudio = audioPlayer;
}
/**
* 执行方法
*/
@Override
public void execute() {
myAudio.play();
} }
public class RewindCommand implements Command { private AudioPlayer myAudio; public RewindCommand(AudioPlayer audioPlayer){
myAudio = audioPlayer;
}
@Override
public void execute() {
myAudio.rewind();
} }
public class StopCommand implements Command {
private AudioPlayer myAudio; public StopCommand(AudioPlayer audioPlayer){
myAudio = audioPlayer;
}
@Override
public void execute() {
myAudio.stop();
} }
请求者角色,由键盘类扮演
public class Keypad {
private Command playCommand;
private Command rewindCommand;
private Command stopCommand; public void setPlayCommand(Command playCommand) {
this.playCommand = playCommand;
}
public void setRewindCommand(Command rewindCommand) {
this.rewindCommand = rewindCommand;
}
public void setStopCommand(Command stopCommand) {
this.stopCommand = stopCommand;
}
/**
* 执行播放方法
*/
public void play(){
playCommand.execute();
}
/**
* 执行倒带方法
*/
public void rewind(){
rewindCommand.execute();
}
/**
* 执行播放方法
*/
public void stop(){
stopCommand.execute();
}
}
客户端角色,由茱丽小女孩扮演
public class Julia {
public static void main(String[]args){
//创建接收者对象
AudioPlayer audioPlayer = new AudioPlayer();
//创建命令对象
Command playCommand = new PlayCommand(audioPlayer);
Command rewindCommand = new RewindCommand(audioPlayer);
Command stopCommand = new StopCommand(audioPlayer);
//创建请求者对象
Keypad keypad = new Keypad();
keypad.setPlayCommand(playCommand);
keypad.setRewindCommand(rewindCommand);
keypad.setStopCommand(stopCommand);
//测试
keypad.play();
keypad.rewind();
keypad.stop();
keypad.play();
keypad.stop();
}
}
运行结果如下:aaarticlea/png;base64,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" alt="" />
宏命令
所谓宏命令简单点说就是包含多个命令的命令,是一个命令的组合。
设想茱丽的录音机有一个记录功能,可以把一个一个的命令记录下来,再在任何需要的时候重新把这些记录下来的命令一次性执行,这就是所谓的宏命令集功能。因此,茱丽的录音机系统现在有四个键,分别为播音、倒带、停止和宏命令功能。此时系统的设计与前面的设计相比有所增强,主要体现在Julia类现在有了一个新方法,用以操作宏命令键。
源代码
系统需要一个代表宏命令的接口,以定义出具体宏命令所需要的接口。
public interface MacroCommand extends Command {
/**
* 宏命令聚集的管理方法
* 可以添加一个成员命令
*/
public void add(Command cmd);
/**
* 宏命令聚集的管理方法
* 可以删除一个成员命令
*/
public void remove(Command cmd);
}
具体的宏命令MacroAudioCommand类负责把个别的命令合成宏命令。
public class MacroAudioCommand implements MacroCommand { private List<Command> commandList = new ArrayList<Command>();
/**
* 宏命令聚集管理方法
*/
@Override
public void add(Command cmd) {
commandList.add(cmd);
}
/**
* 宏命令聚集管理方法
*/
@Override
public void remove(Command cmd) {
commandList.remove(cmd);
}
/**
* 执行方法
*/
@Override
public void execute() {
for(Command cmd : commandList){
cmd.execute();
}
} }
客户端类Julia
public class Julia { public static void main(String[]args){
//创建接收者对象
AudioPlayer audioPlayer = new AudioPlayer();
//创建命令对象
Command playCommand = new PlayCommand(audioPlayer);
Command rewindCommand = new RewindCommand(audioPlayer);
Command stopCommand = new StopCommand(audioPlayer); MacroCommand marco = new MacroAudioCommand(); marco.add(playCommand);
marco.add(rewindCommand);
marco.add(stopCommand);
marco.execute();
}
}
运行结果如下:aaarticlea/png;base64,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" alt="" />
命令模式的优点
● 更松散的耦合
命令模式使得发起命令的对象——客户端,和具体实现命令的对象——接收者对象完全解耦,也就是说发起命令的对象完全不知道具体实现对象是谁,也不知道如何实现。
● 更动态的控制
命令模式把请求封装起来,可以动态地对它进行参数化、队列化和日志化等操作,从而使得系统更灵活。
● 很自然的复合命令
命令模式中的命令对象能够很容易地组合成复合命令,也就是宏命令,从而使系统操作更简单,功能更强大。
● 更好的扩展性
由于发起命令的对象和具体的实现完全解耦,因此扩展新的命令就很容易,只需要实现新的命令对象,然后在装配的时候,把具体的实现对象设置到命令对象中,然后就可以使用这个命令对象,已有的实现完全不用变化。
设计模式《JAVA与模式》之命令模式的更多相关文章
- Java进阶篇设计模式之八 ----- 责任链模式和命令模式
前言 在上一篇中我们学习了结构型模式的享元模式和代理模式.本篇则来学习下行为型模式的两个模式, 责任链模式(Chain of Responsibility Pattern)和命令模式(Command ...
- 设计模式之第14章-命令模式(Java实现)
设计模式之第14章-命令模式(Java实现) “小明,滚出去.”“小明,这个问题怎么做?”(可怜的小明无奈躺枪.小明:老师,我和你有什么仇什么怨,我和你有什么仇什么怨啊到底...老师:小明,滚出去.习 ...
- Java设计模式之八 ----- 责任链模式和命令模式
前言 在上一篇中我们学习了结构型模式的享元模式和代理模式.本篇则来学习下行为型模式的两个模式, 责任链模式(Chain of Responsibility Pattern)和命令模式(Command ...
- .NET设计模式(17):命令模式(Command Pattern)(转)
概述 在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”.但在某些场合,比如要对行为进行“记录.撤销/重做.事务”等处理,这种无法抵御变化的紧耦合是不合适的.在这种情况下,如何将“行为 ...
- IOS设计模式之四(备忘录模式,命令模式)
本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq) ...
- 设计模式---行为变化模式之命令模式(Command)
前提:行为变化模式 在组件的构建过程中,组建行为的变化经常导致组件本身剧烈的变化.“行为变化”模式将组件的行为和组件本身进行解耦,从而支持组件的变化,实现两者之间的松耦合. 类中非虚函数和静态函数方法 ...
- C#设计模式学习笔记:(14)命令模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7873322.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第二个模式--命 ...
- IDEA terminal无法从vim的编辑模式转换为命令模式
Git 修改最后一次的commit历史记录:https://www.baidu.com/link?url=2WF8yFd0iBuVmXLWfutmSoXa12K9D143e_B0A3PTYYHEP9r ...
- Java设计模式(学习整理)---命令模式
设计模式之Command(学习整理) 1.Command定义 不少Command模式的代码都是针对图形界面的,它实际就是菜单命令,我们在一个下拉菜单选择一个命令时,然后会执行一些动作. 将这些命令封装 ...
- java设计模式8.迭代子模式、责任链模式、命令模式
迭代子模式 迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象.它将迭代逻辑封装到一个独立的迭代子对象中,从而与聚集本身分开.迭代子对象是对遍历的抽象化,不同的聚集对象可以提供相同的迭代 ...
随机推荐
- html--笔记day03
html--笔记day03 1.结构标记 1.<header>元素 <header></header> ==> <div id="header ...
- 【转】MongoDB导入导出以及数据库备份
-------------------MongoDB数据导入与导出------------------- 1.导出工具:mongoexport 1.概念: mongoDB中的m ...
- 2019.01.23 ural1519 Formula 1(轮廓线dp)
传送门 轮廓线dpdpdp模板题. 题意简述:给一个放有障碍的网格图,问有多少种方法能使所有非障碍格子都在同一条哈密顿回路上面. 考虑用括号序列的写法来状压这个轮廓线. 用000表示没有插头,111表 ...
- JS将时间戳转化为时间
//将时间戳转化为时间 function timestampToTime(timestamp) { var date = new Date(timestamp * 1000);//时间戳为10位需*1 ...
- CString int转换
1.CString 转 int CString strtemp = "100"; int intResult; intResult= atoi(strtem ...
- UVa 10163 Storage Keepers (二分 + DP)
题意:有n个仓库,m个管理员,每个管理员有一个能力值P,每个仓库只能由一个管理员看管,但是每个管理员可以看管k个仓库(但是这个仓库分配到的安全值只有p/k,k=0,1,...),雇用的管理员的工资即为 ...
- Mysql分析优化查询的方式
一:查询语句分析 1.通过create index idx_colunmsName on tableName(columns)为某个表的某些字段创建索引,注意主键和唯一键都会自动创建索引: 如为表st ...
- tp5 excel导出类
1.引入Loader use think\Loader; 2.导出方法: /** * excel表格导出 * @param string $fileName 文件名称 * @param array $ ...
- spoj high
matrixtree定理裸体,学了行列式的n^3解法,(应该是能应用于所有行列式): 代码是参考某篇题解的... #include<iostream> #include<cstrin ...
- linux 各项分布(个人记录)
1.根目录文件 root:存放root用户的相关文件home:存放普通用户的相关文件bin :存放常用命令的目录sbin:要具有一定权限才可以使用的命令mnt :挂在光驱和软盘的目录boot:存放引导 ...