将请求封装为对象,从而可以使用不同的请求对客户进行参数化,该模式的关键在于对不同请求的封装。简单的说,也就是在请求发出者和客户间通过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的更多相关文章

  1. 设计模式のCommand Pattern(命令模式)----行为模式

    一.产生背景 熟悉计算机的同学应该清楚,用户发出各种命令,CPU执行命令,OS负责调度.命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式.请求以命令的形式包裹在对象 ...

  2. 使用C# (.NET Core) 实现命令设计模式 (Command Pattern)

    本文的概念内容来自深入浅出设计模式一书. 项目需求 有这样一个可编程的新型遥控器, 它有7个可编程插槽, 每个插槽可连接不同的家用电器设备. 每个插槽对应两个按钮: 开, 关(ON, OFF). 此外 ...

  3. C++设计模式-Command命令模式

    Command命令模式作用:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作. 由于“行为请求者”与“行为实现者”的紧耦合,使用命令模式 ...

  4. 使用 C# (.NET Core) 实现命令设计模式 (Command Pattern)

    本文的概念内容来自深入浅出设计模式一书. 项目需求 有这样一个可编程的新型遥控器, 它有7个可编程插槽, 每个插槽可连接不同的家用电器设备. 每个插槽对应两个按钮: 开, 关(ON, OFF). 此外 ...

  5. java设计模式-Command模式

    1.背景: 站在MM的角度,想命令追求者Boy干什么就干什么,而且将来还可以扩展,怎么做?   2.代码: Command.java: package com.cy.dp.command; publi ...

  6. [C++设计模式] command 命令模式

    在软件系统中,"行为请求者"与"行为实现者"通常呈现一种"紧耦合". 但在某些场合,比方要对行为进行"记录.撤销/重做.事务&qu ...

  7. Java 设计模式之 Command 设计模式

    首先我们先来看 UML 图: 参考资料: java设计模式-Command(命令)模式 - - ITeye技术网站http://men4661273.iteye.com/blog/1633775 JA ...

  8. Java 设计模式实现 不错的引用

    这段时间有兴趣重新温习一下设计模式在Java中的实现,碰巧看到一个不错的设计模式总结,这里引用一下作为参考. 创建型模式: JAVA设计模式-Singleton JAVA设计模式-Factory JA ...

  9. [php]php设计模式 (总结)

    转载自[php]php设计模式 (总结) 传统的23种模式(没有区分简单工厂与抽象工厂) http://www.cnblogs.com/bluefrog/archive/2011/01/04/1925 ...

随机推荐

  1. shopnc 商城源码阅读笔记--开篇概述

    关于shopnc 以下是摘抄自百度百科的关于shopnc的介绍: ShopNC商城系统,是天津市网城天创科技有限责任公司开发的一套多店模式的商城系统. 本系统具有商城系统非常完整和专业的功能与流程,系 ...

  2. YII千万级PV架构经验分享--俯瞰篇--性能介绍

    一张图,啥也不说了.直接上图,大图真难画. 呃,非得写满二百个字,其实本来想画均衡负债,一些服务器假设列子的,突然发现,没有业务要求,画不出来.写了这么久了,天天熬夜,得休息几天再继续.其实还有非常重 ...

  3. [旧博客]Python 第一天总结

    语法部分: 3**4 表示3的四次方 -1**3 结果是-1 raw_input 输入文本 input 输入值,input 3*3 结果为9 pow(5,5) 等于 5*5 abs(-1.8) 等于 ...

  4. JS 实现取整

    Js 常用数值函数(Math,parseInt)取整   1.丢弃小数部分,保留整数部分parseInt(5/2) 2.向上取整,有小数就整数部分加1Math.ceil(5/2) 3,四舍五入.Mat ...

  5. 判断webpart类型 How can I tell what type a web part is?

    using(new SPSite("http://mysite/myweb").OpenWeb()){ //give relative path of the webpartpag ...

  6. 4.4 spring-自定义标签的解析

    1.0 自定义标签的解析. 在之前的章节中,我们完成了对spring 默认标签的加载过程.那么现在我们将开始新的里程, spring 自定义标签的解析; 代码如下: /** * Parse the e ...

  7. winform保存登录cookie

       在web程序中,我们通常使会使用cookie来保存一些用户状态,或者权限或者你想保存的东西,但是在CS程序中,如果要使用cookie就必须要做些功课了... 最好注意以下几点:   1.使用成员 ...

  8. [转载]MongoDB的$inc修改器

    MongoDB的$inc修改器相当于编程语言中的 “+=”“$inc”只能用于操作数值类型的数据,包括整数.长整数和双精度浮点数,用于其他类型的数据会导致操作失败. >db.users.find ...

  9. [转载]自定义ASP.NET MVC Html辅助方法 TagBuilder

    在ASP.NET MVC中,Html辅助方法给我们程序员带来很多方便,其重要性也就不言自明.有时候,我们不想重复地写一些HTML代码,或者MS没有提供我们想要的那个HTML标签的Html辅助方法,那么 ...

  10. The 6th Zhejiang Provincial Collegiate Programming Contest->ProblemB:Light Bulb

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3203 题意:求影子的最长长度L; 当灯,人头和墙角成一条直线时(假设此时人 ...