命令模式(行为型)

原创 2017年01月03日 17:53:15

  在古代两国交战,皇帝都不直接指挥军队,而是将指挥权交给得力大将,由他来指挥军队,将军如何指挥军队皇帝也不管,皇帝只要你打赢了就可以;当皇帝说不打了,就给将军发一道圣旨说撤退,怎么撤退皇帝也不管,由将军自由发挥。
  电视遥控器不会直接让电视换频道,是发出一个换频道信号,电视接收到了这个信号就执行换频道的操作。这个例子中遥控器是请求的发送者,电视机就是请求的接收者。
  在软件设计中,我们经常需要向某些对象发送请求,不过不知道请求的接收者是谁,也不知道被请求的操作是哪个,只要在程序运行时指定具体的请求接收者即可。这时使用命令模式,可以使发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,不必知道如何完成请求。
定义:将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。
结构

  • 命令角色,定义命令的接口,声明具体命令类需要执行的方法
  • 具体命令角色:命令接口的实现,持有接收者,并调用接收者的功能来完成命令要执行的操作
  • 发送者角色:负责调用命令对象执行请求,持有命令对象;使用命令对象的入口
  • 接收者角色:真正的执行命令的对象。任何类都有可能成为一个接收者,只要它能够实现命令要求实现的相应功能。

适用场景

  • 系统需要将请求调用者和请求接收着解耦,使得调用者和接收者不直接交互
  • 系统需要在不同的时间指定请求、将请求排队和执行请求
  • 系统需要支持命令的撤销操作和回复操作
  • 系统需要将一组操作组合在一起

UML类图
这里写图片描述

下面是代码的实现:
Command

public interface Command {
    void execute1();
    void execute2();
}

public class ConcreteCommand implements Command {
    Receiver receiver;
    public ConcreteCommand(Receiver receiver){
        this.receiver = receiver;
    }
    @Override
    public void execute1() {
        receiver.executeAction1();
    }
    @Override
    public void execute2() {
        receiver.executeAction2();
    }
}

Invoker

public class Invoker {
    Command command;
    public void setCommand(Command command){
        this.command = command;
    }
    public void invoke(int i){
        if(i==1)
            command.execute1();
        if(i==2)
            command.execute2();
    }
}

Receiver

public class Receiver {
    public Receiver(){}
    public void executeAction1(){
        System.out.println("执行操作1");
    }
    public void executeAction2(){
        System.out.println("执行操作2");
    }
}

Test

public class Test {
    public static void main(String[] args){
        Receiver receiver = new Receiver();
        ConcreteCommand concreteCommand = new ConcreteCommand(receiver);
        Invoker invoker = new Invoker();
        invoker.setCommand(concreteCommand);
        invoker.invoke(2);
    }
}

总结
  命令模式很好地将降低了系统的耦合性,把命令的调用者与执行者分开,使双方不必关心对方是如何操作的,这是命令模式的精髓所在;也使得系统具有很好的扩展性,当有新的命令时,可以很容易的加入到系统中。
  但命令模式也时有缺点的,因为对于每一个命令都要有一个具体的类来实现,这样对于某些命令类型很多的系统来说,就会有很多的具体命令类,并且使用命令模式就要引入调用者接收者两个角色,势必增加类的数量,所有并不是使用了命令模式就是好的,需要做出权衡。


参考:https://github.com/simple-android-framework/android_design_patterns_analysis/tree/master/command/lijunhuayc
   http://design-patterns.readthedocs.io/zh_CN/latest/behavioral_patterns/command.html
   http://blog.csdn.net/zhengzhb/article/details/7550895

版权声明:本文为博主原创文章,未经博主允许不得转载。

设计模式(行为型)之命令模式(Command Pattern)

在软件开发中,我们经常需要向某些对象发送请求(调用其中的某个或某些方法),但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,此时,我们特别希望能够以一种松耦合的方式来设计软件,使得请求发送者与...
  • yanbober
  • yanbober
  • 2015年05月05日 11:49
  • 3021

行为型模式-命令(command)

命令将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作.实例main.cc:#include #include "club_manage...
  • dabenxiong666
  • dabenxiong666
  • 2017年03月23日 22:22
  • 2770

JAVA设计模式(15):行为型-命令模式(Command)

装修新房的最后几道工序之一是安装插座和开关,通过开关可以控制一些电器的打开和关闭,例如电灯或者排气扇。在购买开关时,我们并不知道它将来到底用于控制什么电器,也就是说,开关与电灯、排气扇并无直接关系,一...
  • taozi8023
  • taozi8023
  • 2016年05月19日 12:58
  • 7713

(行为型模式) Command 命令模式

  • 2012年09月29日 23:47
  • 176KB
  • 下载

行为型--命令模式

模式意图将一个请求封装为一个对象,从而使用户可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。模式适用性在许多设计中,经常涉及到一个对象请求另一个对象调用其方法到达某种目...
  • little_nai
  • little_nai
  • 2016年07月05日 16:01
  • 204

命令模式Command(对象行为型)

命令模式Command(对象行为型)
  • u010947098
  • u010947098
  • 2017年06月15日 17:49
  • 157

Command命令(行为型模式)

耦合与变化 耦合是软件不能抵御变化灾难的根本性原因,不仅实体对象与实体对象之间存在耦合关系,实习对象与行为操作之间也存在耦合关系。 动机(Motivation) 在软件构...
  • hjf19790118
  • hjf19790118
  • 2011年10月16日 15:17
  • 197

3.2 Command(命令) -- 对象行为型模式

模式定义:         命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。         命令对象将动作和接受者包进对象中,...
  • qianqiuwanzi
  • qianqiuwanzi
  • 2015年05月10日 18:23
  • 457

行为型模式之命令COMMAND

一、意图将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。二、图解 COMMAND模式的意图很是费解,以上图为例,个人理解为,本来我们...
  • qq_16234613
  • qq_16234613
  • 2017年03月05日 09:59
  • 151

十四、命令模式Command(行为型)

将一个请求封装为一个对象,从而使你可以实现用不同请求对客户进行参数化、对请求进行排队或记录请求日志,以及支持可撤销的操作。有时必须向某对象提交请求,但是当前对象并不知道关于被请求的操作或请求的接受者的...
  • teaandnoodle
  • teaandnoodle
  • 2016年07月29日 19:29
  • 195
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:命令模式(行为型)
举报原因:
原因补充:

(最多只允许输入30个字)