设计模式 - 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 ...
随机推荐
- 图片延迟加载库Layzr
<!DOCTYPE html> <html> <head> <title>Layzr Demo</title> <script src ...
- Spark小课堂Week3 FirstSparkApp(RDD开发)
Spark小课堂Week3 FirstSparkApp 问题:Java有哪些数据结构 大致有如下几种,其中List与Map是最重要的: List Map Set Array Heap Stack Qu ...
- hadoop中遇到的问题。
1.物理主机中无法访问管理界面,在虚拟主机中可以访问, 这跟防火墙有关系,重启一下防火墙,然后关闭,最后重启一下handoop,应该就可以了!!!!(hadoop首战顺利!!!!!(●'◡'●))
- raise_application_error用法
我们经常通过dbms_output.put_line来输出异常信息,但有时需要把异常信息返回给调用的客户端.此时我们用raise_application_error,允许用户在pl/sql中返回用户自 ...
- [译] ASP.NET 生命周期 – ASP.NET 请求生命周期(三)
使用特殊方法处理请求生命周期事件 为了在全局应用类中处理这些事件,我们会创建一个名称以 Application_ 开头,以事件名称结尾的方法,比如 Application_BeginRequest.举 ...
- bnuoj 29375 Two Strings(字符串?)
http://www.bnuoj.com/bnuoj/problem_show.php?pid=29375 [题意]:可以对两字符串进行如下操作: 1.可以无损耗交换相邻两个字符(可以理解成交换任意字 ...
- 1063: [Noi2008]道路设计 - BZOJ
Description Z 国坐落于遥远而又神奇的东方半岛上,在小Z 的统治时代公路成为这里主要的交通手段.Z 国共有n 座城市,一些城市之间由双向的公路所连接.非常神奇的是Z 国的每个城市所处的经度 ...
- rsync介绍
老套的搬用一下rsync的介绍,rsync是Linux系统下的数据镜像备份工具,从软件的命名上就可以看出来了——remote sync.rsync支持大多数的类Unix系统,无论是Linux.Sola ...
- EntityFreamWork和Mvc 精品知识点
定义了DbRepository<TEntity>:IRepository<TEntity> ,SimpleDbContext继承了DbContext, UnitOfWork:I ...
- 修改netbeans模版头部的说明
以新建一个php类文件为例: 有两个地方需要修改, 1,工具->模版->默认许可证->在编辑器中打开 2,工具->模版->选择php类->在编辑器中打开 即可进行修 ...