Behavioral模式之Command模式

1.意图

将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

2.别名

动作(Action),事务(Transaction)

3.动机

有时必须向某对象提出请求,当但并不知道关于被请求的操作或请求的接收者任何信息。例如,用户界面工具箱包括按钮和菜单这样的对象,它的执行请求响应用户输入。但工具箱不能显式的在按钮或菜单中实现该请求,因为只有使用工具箱的应用知道那该由哪个对象做哪个操作。而工具箱的设计者无法知道请求的请求者或执行的操作。

4.适用性

以下情况使用Command模式:

  • 在不同的时刻指定、排列和执行请求一个Command对象可以有一个与初始请求无关的生存期。如果一个请求的接收者可用一种和地址空间无关的表达方式,那么就可以将负责该请求的命令对象传递给另一个不同的进程并在那儿实现该请求。
  • 支持取消操作。
  • 支持修改日志。
  • 用构建在原语操作的高层操作构建一个系统。这样一种结构在支持事务的信息系统中很常见。

5.结构

命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行。这个过程好在,三者相互解耦,任何一方都不用去依赖其他人,只需要做好自己的事儿就行,司令员要的是结果,不会去关注到底士兵是怎么实现的。我们看看关系图:

Invoker是调用者(司令员),Receiver是被调用者(士兵),MyCommand是命令,实现了Command接口,持有接收对象,看实现代码:

6.代码示例

实现代码:

一个接口:

public interface Command {
    public void exe();
}

实现:

public class MyCommand implements Command {

    private Receiver receiver;

    public MyCommand(Receiver receiver) {
        this.receiver = receiver;
    }

    @Override
    public void exe() {
        receiver.action();
    }
}

public class Receiver {
    public void action(){
        System.out.println("command received!");
    }
}

public class Invoker {

    private Command command;

    public Invoker(Command command) {
        this.command = command;
    }

    public void action(){
        command.exe();
    }
}

测试类:

public class Test {

public static void main(String[] args) {
    Receiver receiver = new Receiver();
    Command cmd = new MyCommand(receiver);
    Invoker invoker = new Invoker(cmd);
    invoker.action();
}

}

“`

输出:command received!

这个很哈理解,命令模式的目的就是达到命令的发出者和执行者之间解耦,实现请求和执行分开,熟悉Struts的同学应该知道,Struts其实就是一种将请求和呈现分离的技术,其中必然涉及命令模式的思想!

7.相关模式

  • Composite模式:可被用来实现宏命令。
  • memento模式:可用来保持某个状态,命令用这一状态来取消它的效果。

引用:

http://openhome.cc/Gossip/DesignPattern/DecoratorPattern.htm

http://item.jd.com/10057319.html

http://blog.csdn.net/zhangerqing/article/details/8239539

时间: 2024-08-29 01:30:11

Behavioral模式之Command模式的相关文章

Java命令模式(Command模式)

Command模式是最让我疑惑的一个模式,我在阅读了很多代码后,才感觉隐约掌握其大概原理,我认为理解设计模式最主要是掌握起原理构造,这样才对自己实际编程有指导作用.Command模式实际上不是个很具体,规定很多的模式,正是这个灵活性,让人有些confuse. Command定义 不少Command模式的代码都是针对图形界面的,它实际就是菜单命令,我们在一个下拉菜单选择一个命令时,然后会执行一些动作. 将这些命令封装成在一个类中,然后用户(调用者)再对这个类进行操作,这就是Command模式,换句

Command模式

在开发中,有时需要向对象发送请求,但是不知道请求的接受者是谁,被请求的操作是什么.这时可以使用command模式. Command模式将请求封装到一个对象(Command)中,并将请求的接受者存放到具体的ConcreteCommand类中的Receiveer中.这样实现了操作的对象和操作的具体实现之间的解耦. 实现 Receiver.h #ifndef _RECIEVER_H_ #define _RECIVEER_H_ class Reciever { public: Reciever(); ~

Command模式(C++命令模式)

重新温习GOF23到第19个命令模式了,写下来方便自己理解 用经理,秘书,邮局来理解这个模式还是比较好的. 经理:喂,小丽呀,这儿有封信,请帮我尽快寄出去- 秘书:好的,经理,我马上去办! 秘书拿着这封信,到一家邮局将信寄了出去.邮局最终也将信投递到了收件人手中. 这是一个很常见的生活工作场景,不过这里面:经理.秘书和邮局,三者在不知不觉间,演绎了一出面向对象设计模式:Command模式.Command模式是我打算讲的第一个行为型设计模式. Command模式的内容大致如此: 将一个请求封装成一

NET设计模式 第二部分 行为型模式(16):命令模式(Command Pattern)

命令模式(Command Pattern) ——.NET设计模式系列之十七 TerryLee,2006年7月 概述 在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”.但在某些场合,比如要对行为进行“记录.撤销/重做.事务”等处理,这种无法抵御变化的紧耦合是不合适的.在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,可以实现二者之间的松耦合[李建忠].这就是本文要说的Command模式. 意图 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行

command命令模式(行为模式)之我见

我觉得command命令模式的本质就是把触发者和接受者隔离开来,把一个函数能干的事情提升到类的级别 搞一个基类包含虚函数excute() 搞好多具体的接受者类C**command(),在具体接收类中去实现excute,和触发者invoke接触的是基类,利用多态性,真正干事儿的是具体的接受者类,这样隔离开来,无论加多少具体的接受者类 既有代码都不受影响 非常灵活 很多linux的软件既可以支持UI操作,也可以支持命令函操作.这时候就必须用command模式. command模式实际上把软件真正的业

.NET设计模式(17):命令模式(Command Pattern)(转)

概述 在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”.但在某些场合,比如要对行为进行“记录.撤销/重做.事务”等处理,这种无法抵御变化的紧耦合是不合适的.在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,可以实现二者之间的松耦合[李建忠].这就是本文要说的Command模式. 意图 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤消的操作.[GOF <设计模式>] 结构图 Command模式

设计模式--命令模式(Command)

基本概念: Command模式也叫命令模式 ,是行为设计模式的一种.Command模式通过被称为Command的类封装了对目标对象的调用行为以及调用参数,命令模式将方法调用给封装起来了. 命令模式的几个角色: Command: 抽象命令类 ConcreteCommand: 具体命令类 Invoker: 调用者 Receiver: 接收者 Client:客户类 命令模式的优缺点: 优点 1. 降低了系统耦合度 2. 新的命令可以很容易添加到系统中去. 缺点 使用命令模式可能会导致某些系统有过多的具

第 12 章 命令模式【Command Pattern】

以下内容出自:<<24种设计模式介绍与6大设计原则>> 今天讲命令模式,这个模式从名字上看就很简单,命令嘛,老大发命令,小兵执行就是了,确实是这个意思,但是更深化了,用模式来描述真是是世界的命令情况.正在看这本书的你,我猜测分为两类:已经工作的和没有工作的,先说没有工作的,那你为啥要看这本书,为了以后工作呗,只要你参见工作,你肯定会待在项目组,那今天我们就以项目组为例子来讲述命令模式. 我是我们部门的项目经理,就是一个项目的头,在中国做项目,项目经理就是什么都要懂,什么都要管,做好

命令模式(Command)

一.命令模式介绍 命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志.以及支持可撤销的操作. 说白了,就是将一系列的请求命令封装起来,不直接调用真正执行者的方法,这样比较好扩展. 命令模式UML图: Command(抽象命令类):抽象出命令对象,可以根据不同的命令类型.写出不同的实现类 ConcreteCommand(具体命令类):实现了抽象命令对象的具体实现 Invoker(调用者/请求者):请求的发送者,它通过命令对象来执行请求.一个调用者并