GOF23设计模式之命令模式(command)
一、命令模式概述
将一个请求封装到一个对象,从而使得可用不同的请求对客户进行参数化。
二、命令模式结构
(1)Command 抽象命令类
(2)ConcreteCommand 具体命令类
(3)Invoker 调用者 / 请求者
请求的发送者,他通过命令对象来执行。一个调用者并不需要在设计时确定其接受者,因此它只与抽象命令类之间存在关联,在程序运行时,将调用命令对象的execute(),间接调用接受者的相关操作。
(4)Receiver 接收者
接收者执行与请求相关的操作,具体实现对请求的业务处理。
未抽象前,实际执行操作内容的对象。
(5)Client 客户类
在客户类中需要创建调用者对象、具体命令类对象,在创建具体命令类对象时指定对应的接受者。发送者和接收者之间没有直接关系,都通过命令对象间接调用。
三、命令模式场景导入与示例代码
场景:在军队中,团长发出作战命令,但不指定谁去执行命令,命令根据接受者的不同去让接受者(战士)去执行命令。
/**
* 命令接口
* @author CL
*
*/
public interface Command {
/**
* 在真正的项目中可以设计多个方法
*/
void execute();
} /**
* 真正的命令
* @author CL
*
*/
class ConcreteCommand implements Command {
/**
* 命令真正的执行者
*/
private Receiver receiver; public ConcreteCommand() {
} public ConcreteCommand(Receiver receiver) {
this.receiver = receiver;
} @Override
public void execute() {
//命令执行前或后,进行相关的操作
receiver.action();
} }
/**
* 命令的调用者或发起者(相当于例子中的团长)
* @author CL
*
*/
public class Invoke { private Command command; //也可以通过容器List<Command>容纳很多的命令,进行批处理。
//数据库底层的事务管理就是类似的结构! public Invoke(Command command) {
this.command = command;
} /**
* 下达命令
*/
public void call() {
//命令执行前或后,进行相关的操作
//通过命令对象间接调用接收者
command.execute();
} }
/**
* 真正的命令执行者(相当于例子中的战士)
* @author CL
*
*/
public class Receiver { /**
* 执行命令
*/
public void action() {
System.out.println("战士去执行作战命令!");
} }
测试:
/**
* 测试命令模式
* @author CL
*
*/
public class Client { public static void main(String[] args) {
//创建具体命令类对象并指定对应的接受者
Command command = new ConcreteCommand(new Receiver()); Invoke invoke = new Invoke(command); invoke.call();
}
}
控制台输出:
战士去执行作战命令!
四、命令模式场景开发应用场景
(1)Struts2 中,action 的整个调用过程就是命令模式;
(2)数据库事务机制的底层实现;
(3)命令的撤销和恢复;
(4)…………
GOF23设计模式之命令模式(command)的更多相关文章
- 设计模式 ( 十三 ) 命令模式Command(对象行为型)
设计模式 ( 十三 ) 命令模式Command(对象行为型) 1.概述 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需 ...
- 乐在其中设计模式(C#) - 命令模式(Command Pattern)
原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...
- 面向对象设计模式_命令模式(Command)解读
在.Net框架中很多对象的方法中都会有Invoke方法,这种方法的设计实际是用了设计模式的命令模式, 模式图如下 其核心思路是将Client 向Receiver发送的命令行为进行抽象(ICommand ...
- 二十四种设计模式:命令模式(Command Pattern)
命令模式(Command Pattern) 介绍将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可取消的操作. 示例有一个Message实体类,某个 ...
- 设计模式-15命令模式(Command Pattern)
1.模式动机 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使 ...
- 【GOF23设计模式】命令模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_命令模式.数据库事务机制底层架构实现.撤销和回复 package com.test.command; public cla ...
- 设计模式之命令模式(Command)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- [设计模式] 14 命令模式 Command
Command 模式通过将请求封装到一个对象(Command)中,并将请求的接受者存放到具体的 ConcreteCommand 类中(Receiver)中,从而实现调用操作的对象和操作的具体实现者之间 ...
- 大熊君说说JS与设计模式之------命令模式Command
一,总体概要 1,笔者浅谈 日常生活中,我们在看电视的时候,通过遥控器选择我们喜欢的频道时,此时我们就是客户端的角色,遥控器的按钮相当于客户请求,而具体执行的对象就是命令对象, 命令模式把一个请求或者 ...
随机推荐
- System.Zip
自XE2增加的System.Zip单元很好.注意事项: 1.文件压缩到文档后所使用的文件名会成为解压后的文件名,如果该文件名为指定文件名且无后缀名,那么解压出来的文件名也没有后缀名:
- APUE学习笔记——10.可靠信号与不可靠信号
首先说明:现在大部分Unix系系统如Linux都已经实现可靠信号. 1~31信号与SIGRTMIN-SIGRTMAX之间并不是可靠信号与不可靠信号的区别,在大多数系统下他们都是可靠信号. 只不过: 1 ...
- yii2.0 高级版 restful api使用
1.复制任意个目录(backend)为api 2.打开api下的main.php 修改 id=>app-api,'controllerNamespace' => 'api\controll ...
- Android 屏幕密度适配
Android Icon Size and Location for Apps 分辨率 DPI Density scale 1dp对应像素 1dp对应物理尺寸 Location Icon Size ...
- Shell 命令行统计 apache 网站日志访问IP以及IP归属地
Shell 命令行统计 apache 网站日志访问IP以及IP归属地 我的一个站点用 apache 服务跑着,积攒了很多的日志.我想用 shell 看看有哪些人访问过我的站点,并且他来自哪里. 因为日 ...
- ORA-06512: at "SYS.XMLTYPE" 问题记录
执行SQL报错: SQL> SELECT COUNT(cl.enable_flg) FROM cont_ledger cl INNER JOIN project_project pp ON cl ...
- Java基础面试题 (一)
1.面向对象的三个特征 封装,继承,多态.这个应该是人人皆知,有时候也会加上抽象. 2.多态的好处 允许不同类对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消息 ...
- Bandit:一种简单而强大的在线学习算法
假设我有5枚硬币,都是正反面不均匀的.我们玩一个游戏,每次你可以选择其中一枚硬币掷出,如果掷出正面,你将得到一百块奖励.掷硬币的次数有限(比如10000次),显然,如果要拿到最多的利益,你要做的就是尽 ...
- JavaScript class 使用
/********************************************************************* * JavaScript class 使用 * 说明: * ...
- 【pandas】pandas.Series.str.split()---字符串分割
原创博文,转载请注明出处! 本文代码的github地址 series中的元素均为字符串时,通过str.split可将字符串按指定的分隔符拆分成若干列的形式. 例子: 拆分以逗号为分隔符的字 ...