设计模式 - command
将请求封装为对象,从而可以使用不同的请求对客户进行参数化,该模式的关键在于对不同请求的封装。简单的说,也就是在请求发出者和客户间通过command对象进行解耦,从而使得请求者可以通过实例化不同的command对象实现不同操作。
command模式类似于c++的回调,我们需要在command的实现类中注册回调函数,也就是将命令的具体执行者注册。
在GOF中,使用了Menu,MenuItem以及doucment的例子还阐述command模式。用户点击menu,将操作事件委托给MenuItem,不同的MenuItem拥有不同的concreteCommand,从而实现menuItem与操作执行者的解耦。
另外,command模式可以支持复合操作,也就是执行一批command(接口实现缘故),并且可以通过记录操作前状态实现撤销操作unexecute,从而为事务处理提供了基础。

command模式的效果:
1) command模式将调用操作的对象与知道如何实现该操作的对象解耦
2) command对象可以像其他对象一样被操纵和扩展
3) 多个command可以复合
4) 增加新command很容易,无需改变其他类
给个例子:
还是公司的事情,公司里有一位大boss;他不喜欢见人,可能是长得丑,也可能是其他原因。他的任何命令都是通过写在小纸条上的command来执行的。纸条上会写上需要执行的任务。如boss想要开房,他就下发一道开房command。
另外一个部门负责编写不同的小纸条,并决定由谁去给boss开房,有可能是大泽玛利亚,也有可能是uncle wang,当然这就跟boss没有关系了,反正房开好了就可以。
这样,就实现了boss和秘书之间的解耦。
代码:
package com.inspur.jiyq.designpattern.command; import com.inspur.jiyq.designpattern.command.impl.ReserveCommand;
import com.inspur.jiyq.designpattern.command.impl.SendMessageCommand; public class BossMain {
public static void main(String[] args)
{
//通过使用command模式,实现了boss和秘书的解耦 //boss想发邮件
Command mailCommand = new SendMessageCommand(new MailMan());
mailCommand.execute(); //boss想开房
Command reserveCommand = new ReserveCommand(new Secretary());
reserveCommand.execute();
}
}
package com.inspur.jiyq.designpattern.command;
public interface Command {
/**
* 执行命令
*/
public void execute();
/**
* 取消已经执行的命令
*/
public void unexecute();
}
package com.inspur.jiyq.designpattern.command;
public class MailMan {
/**
* 发邮件
*/
public void sendMail()
{
System.out.println("MailMan sending mails.");
}
/**
* 回收邮件,前提是得保存前一次送件地址
*/
public void retrieve()
{
System.out.println("MailMan retrieve mails");
}
}
package com.inspur.jiyq.designpattern.command;
public class Secretary {
/**
* 秘书需要做各种预定
*/
public void reserve()
{
System.out.println("Secretary book a room.");
}
}
package com.inspur.jiyq.designpattern.command.impl; import com.inspur.jiyq.designpattern.command.Command;
import com.inspur.jiyq.designpattern.command.Secretary; public class ReserveCommand implements Command{
private Secretary secretary; public ReserveCommand(Secretary secretary)
{
this.secretary = secretary;
} @Override
public void execute() {
secretary.reserve();
} @Override
public void unexecute() {
// TODO Auto-generated method stub
} }
package com.inspur.jiyq.designpattern.command.impl; import com.inspur.jiyq.designpattern.command.Command;
import com.inspur.jiyq.designpattern.command.MailMan; public class SendMessageCommand implements Command {
/**
* 快递哥
*/
private MailMan mailMan; public SendMessageCommand(MailMan mailMan)
{
this.mailMan = mailMan;
} @Override
public void execute() {
mailMan.sendMail(); } @Override
public void unexecute() {
//如果送出去的信写错了,可以要求信差收回来,前提是信差可以这么做 } }
设计模式 - command的更多相关文章
- 设计模式のCommand Pattern(命令模式)----行为模式
一.产生背景 熟悉计算机的同学应该清楚,用户发出各种命令,CPU执行命令,OS负责调度.命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式.请求以命令的形式包裹在对象 ...
- 使用C# (.NET Core) 实现命令设计模式 (Command Pattern)
本文的概念内容来自深入浅出设计模式一书. 项目需求 有这样一个可编程的新型遥控器, 它有7个可编程插槽, 每个插槽可连接不同的家用电器设备. 每个插槽对应两个按钮: 开, 关(ON, OFF). 此外 ...
- C++设计模式-Command命令模式
Command命令模式作用:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作. 由于“行为请求者”与“行为实现者”的紧耦合,使用命令模式 ...
- 使用 C# (.NET Core) 实现命令设计模式 (Command Pattern)
本文的概念内容来自深入浅出设计模式一书. 项目需求 有这样一个可编程的新型遥控器, 它有7个可编程插槽, 每个插槽可连接不同的家用电器设备. 每个插槽对应两个按钮: 开, 关(ON, OFF). 此外 ...
- java设计模式-Command模式
1.背景: 站在MM的角度,想命令追求者Boy干什么就干什么,而且将来还可以扩展,怎么做? 2.代码: Command.java: package com.cy.dp.command; publi ...
- [C++设计模式] command 命令模式
在软件系统中,"行为请求者"与"行为实现者"通常呈现一种"紧耦合". 但在某些场合,比方要对行为进行"记录.撤销/重做.事务&qu ...
- Java 设计模式之 Command 设计模式
首先我们先来看 UML 图: 参考资料: java设计模式-Command(命令)模式 - - ITeye技术网站http://men4661273.iteye.com/blog/1633775 JA ...
- Java 设计模式实现 不错的引用
这段时间有兴趣重新温习一下设计模式在Java中的实现,碰巧看到一个不错的设计模式总结,这里引用一下作为参考. 创建型模式: JAVA设计模式-Singleton JAVA设计模式-Factory JA ...
- [php]php设计模式 (总结)
转载自[php]php设计模式 (总结) 传统的23种模式(没有区分简单工厂与抽象工厂) http://www.cnblogs.com/bluefrog/archive/2011/01/04/1925 ...
随机推荐
- ECSHOP如何解决购物车中商品自动消失问题
最近有客户反映关于ECShop购物车的问题:需要加入多个商品到购物车时,发现之前加入到购物车的商品都自动消失了,只有最后一次加入购物车的商品在里面.那么,这是什么原因呢? 因为ECShop的SESSI ...
- hadoop中遇到的问题。
1.物理主机中无法访问管理界面,在虚拟主机中可以访问, 这跟防火墙有关系,重启一下防火墙,然后关闭,最后重启一下handoop,应该就可以了!!!!(hadoop首战顺利!!!!!(●'◡'●))
- Django文档——Model中的ForeignKey,ManyToManyField与OneToOneField
关联关系字段 (Relationship fields) ForeignKey,ManyToManyField与OneToOneField分别在Model中定义多对一,多对多,一对一关系. 例如,一本 ...
- Matlab生成动态链接库供C#调用
1.首先在Matlab中编写一个或几个.m文件 2.然后在命令空间中输入命令:deploytool 3.修改工程名称,修改需要生成文件后缀 4.添加类,添加文件,然后点击生成.
- 研读代码必须掌握的Eclipse快捷键
1. Ctrl+左键 和F3 这个是大多数人经常用到的,用来查看变量.方法.类的定义跳到光标所在标识符的定义代码.当按执行流程阅读时,F3实现了大部分导航动作. 2 Ctrl+Shift+G在工作空间 ...
- maven3.1.1适合搭配的jdk版本
maven 可以帮助我们管理项目的jar 不同的版本对jdk的要求也不相同, 比如3.1.1就要搭配1.6或以上的jre但是1.7有的版本还是会有点问题 当maven所需的jre版本不对应时项目会报错 ...
- Telerik RadGridView 右键菜单如何设置?
问题: 我想去掉红线框住的部分,希望有会的网友帮助我,谢谢! 解决方法: 默认: 修改: [利用 ContextMenuOpening 事件,对应你的项目,你要自己修改那判断的字符串(你的中文)] p ...
- Object调用静态方法
谁说空指针不能调用方法 public class Foo { public static void bar() { System.out.println("bar"); } pub ...
- C#正则表达式Regex类
C#正则表达式Regex类的使用 C#中为正则表达式的使用提供了非常强大的功能,这就是Regex类.这个包包含于System.Text.RegularExpressions命名空间下面,而这个命名空间 ...
- 3.8 spring-qualifier 子元素的使用与解析
对于 qualifier 子元素,我们接触的更多的是注解形式,在使用Spring 自动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个.当找不到一个匹配的 Bean 时, S ...