我想把命令模式说的更清楚点

作者: 孔祥子看天下 | 来源:发表于2017-03-17 12:33 被阅读82次

命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令

怎么说还是太抽象,怎么办!

我们从一个例子入手:每个家里都有遥控器吧!!!拿电视遥控器来说,几个常见的功能:打开、关闭、换台、音量。差不多了,就是这几个,我们可以把这几个功能抽象为命令。遥控器由谁来操作呢,当然是人了。

从这里看一看到几个概念:

我(请求发出者)
遥控器(命令调度者,集中的各种命令)
按钮(具体调用命令的对象,也就是 command,对于请求发出者而言)
按钮功能(具体做事情的人,接受者 receiver)

好处!

命令模式主要解决的问题:如何将"行为请求者"与"行为实现者"解耦。我发出命令,不去和具体的命令打交道,只需要和遥控器打交道。这样,在遥控器上增加一个功能,例如切换 切换信号源,就很简单了!!!
所以

1、降低了系统耦合度。
2、新的命令可以很容易添加到系统中去。

实际代码

<pre>
public class Invoker {

public enum CommandName {
    TURN_ON,
    TURN_OFF,
}

private AbstractCommand [] commands;

public Invoker() {
    commands = new AbstractCommand[2];
    commands[0] = new TurnOnCommand(new TurnOnReceiver());
    commands[1] = new TurnOffCommand(new TurnOffReceiver());
}

public   void invoke(CommandName name) {
    switch (name.ordinal()) {
        case 0 :
            System.out.println("command TURN_ON");
            commands[0].execute();
            break;

        case 1:
            System.out.println("command TURN_OFF");
            commands[1].execute();
            break;

            default:
                System.err.println("error command name !!! ");
    }
}

public static void main(String[] args) {
    System.out.println("Hello World!");
    Invoker invoker = new Invoker();
    invoker.invoke(CommandName.TURN_ON);
    invoker.invoke(CommandName.TURN_OFF);
}

}

</pre>

<pre>
public abstract class AbstractCommand {
AbstractReceiver receiver;
abstract void execute() ;
}
</pre>

<pre>
public interface AbstractReceiver {
void doJob();
}

</pre>

<pre>
public class TurnOffReceiver implements AbstractReceiver {
@Override
public void doJob() {
System.out.println(" do turn off tv command !");
}
}
</pre>

<pre>
public class TurnOffCommand extends AbstractCommand {

public TurnOffCommand(TurnOffReceiver receiver){
    this.receiver = receiver;
}

@Override
public void execute() {
    System.out.println(" 分发执行关闭电视命令 !");
    this.receiver.doJob();
}

}
</pre>

<pre>
public class TurnOnReceiver implements AbstractReceiver {
@Override
public void doJob() {
System.out.println(" do turn on tv command !");
}
}

</pre>

<pre>
public class TurnOnCommand extends AbstractCommand {

public TurnOnCommand(TurnOnReceiver receiver) {
    this.receiver = receiver;
}

@Override
public void execute() {
    System.out.println(" 分发执行打开电视命令 !");
    this.receiver.doJob();
}

}
</pre>

运行

Paste_Image.png

相关文章

  • 我想把命令模式说的更清楚点

    命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中...

  • 011-谈谈iOS开发 设计模式-01

    一句话:除了delegate、KVO,说点别的(模板方法模式、命令模式、访问者模式等)

  • 我想把自己认清楚

    媳妇儿常常看着我发呆发愣,眼神呆滞迷茫,沉默不语。她会问我怎么了?问我在想什么? 其实没什么,我不是有...

  • 设计模式-命令模式(1)

    命令模式 一.命令模式-定义? ​命令模式(Command Pattern) 第一点:将一个请求封装成为一个对象...

  • Android设计模式(十)-命令模式

    命令模式是行为型设计模式之一。命令模式没那么多条条框框,所以很灵活。命令模式简单的说就是给他下一个命令,然后他就会...

  • vim 操作 && Mac 配置本地Apache

    一、vim 的基本命令操作 vim 的模式: 编辑模式 ,命令模式 编辑模式: 命令模式:可以通过命令 最重要的命...

  • 12.vim的使用技巧

    命令模式 、命令行模式、编辑模式: INSERT 首次进入文件: 命令模式输入: 表示 命令行模式出现...

  • 设计模式

    每天保持进步一点点!! 目录 原型模式 工厂方法模式 抽象工厂模式 策略模式 状态模式 责任链模式 命令模式 原型...

  • 做投资的思路

    做投资想把握住每次市场风格和转折点是比较难的,还是要想清楚自己的持股逻辑,长期还是看成长,还是看成长空间,商业模式...

  • 五、Linux vim编辑器

    vim编辑器三种模式:命令模式、编辑模式、末行模式 1.命令模式: vim进入文件后就是命令模式 1.1 命令模式...

网友评论

    本文标题:我想把命令模式说的更清楚点

    本文链接:https://www.haomeiwen.com/subject/fjlenttx.html