`
反求诸己
  • 浏览: 536847 次
  • 性别: Icon_minigender_1
  • 来自: 湖南娄底
社区版块
存档分类
最新评论

Command模式(命令) 说明和使用场景

 
阅读更多

 

 Command模式(命令)
   Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循一定的编程模式,才能使自己的代码便于理解,易于交流,Command(命令模式)模式是比较常用的一个模式.
   Command命令模式: Command模式通过被称为Command的类封装了对目标对象的调用行为以及调用参数。将一个请求封装为一个对象,从而使你不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
   优点: 解耦了调用者和接受者之间联系。调用者调用一个操作,接受者接受请求执行相应的动作,因为使用Command模式解耦,调用者无需知道接受者任何接口。
   缺点: 造成出现过多的具体命令类
  
   在此写了7个java类来描述说明Command设计模式的实现方式;

  1、 Control.java        命令控制者对象类
  2、 Tv.java             命令接收者对象类
  3、 Command.java        命令接口类
  4、 CommandChannel.java 频道切换命令类
  5、 CommandOff.java     关机命令类
  6、 CommandOn.java      开机命令类
  7、 CommandTest.java    带有main方法的测试类(命令发送者)

 

===============   1、 Control.java
package command;

//命令控制者
public class Control {
  private Command onCommand, offCommand, changeChannel;

  public Control(Command on, Command off, Command channel) {
    onCommand = on;
    offCommand = off;
    changeChannel = channel;
  }

  public void turnOn() {
    onCommand.execute();
  }

  public void turnOff() {
    offCommand.execute();
  }

  public void changeChannel() {
    changeChannel.execute();
  }
}
===============   1 end

 

===============   2、 Tv.java
package command;

//命令接收者
public class Tv {

  public int currentChannel = 0;

  public void turnOn() {
    System.out.println("The televisino is on.");
  }

  public void turnOff() {
    System.out.println("The television is off.");
  }

  public void changeChannel(int channel) {
    this.currentChannel = channel;
    System.out.println("Now TV channel is " + channel);
  }
}
===============   2 end

 

===============   3、 Command.java
package command;

//命令接口
public interface Command {
  void execute();
}
===============   3 end

 

===============   4、 CommandChannel.java
package command;

//频道切换命令
public class CommandChannel implements Command {
  private Tv myTv;

  private int channel;

  public CommandChannel(Tv tv, int channel) {
    myTv = tv;
    this.channel = channel;
  }

  public void execute() {
    myTv.changeChannel(channel);
  }
}
===============   4 end

 

===============   5、 CommandOff.java
package command;

//关机命令
public class CommandOff implements Command {
  private Tv myTv;

  public CommandOff(Tv tv) {
    myTv = tv;
  }

  public void execute() {
    myTv.turnOff();
  }
}
===============   5 end

 

===============   6、 CommandOn.java
package command;

//开机命令
public class CommandOn implements Command {
  private Tv myTv;

  public CommandOn(Tv tv) {
    myTv = tv;
  }

  public void execute() {
    myTv.turnOn();
  }
}
===============   6 end

 

===============   7、 CommandTest.java
package command;

//命令发送者
public class CommandTest{
  public static void main(String[] args){
    //命令接收者
    Tv  myTv = new Tv();
    //开机命令
    CommandOn on = new CommandOn(myTv);
    //关机命令
    CommandOff off = new CommandOff(myTv);
    //频道切换命令
    CommandChannel channel = new CommandChannel(myTv, 2);
    //命令控制对象
    Control control = new Control( on, off, channel);

    //开机
    control.turnOn();
    //切换频道
    control.changeChannel();
    //关机
    control.turnOff();
  }
}
===============   7 end


  Command模式通常可应用到以下场景:
  1 Multi-level undo(多级undo操作)
    如果系统需要实现多级回退操作,这时如果所有用户的操作都以command对象的形式实现,系统可以简

    单地用stack来保存最近执行的命令,如果用户需要执行undo操作,系统只需简单地popup一个最近的

    command对象然后执行它的undo()方法既可。
 
  2 Transactional behavior(原子事务行为)
    借助command模式,可以简单地实现一个具有原子事务的行为。当一个事务失败时,往往需要回退到执

    行前的状态,可以借助command对象保存这种状态,简单地处理回退操作。

 

  3 Progress bars(状态条)
    假如系统需要按顺序执行一系列的命令操作,如果每个command对象都提供一个

    getEstimatedDuration()方法,那么系统可以简单地评估执行状态并显示出合适的状态条。

 

  4 Wizards(导航)
    通常一个使用多个wizard页面来共同完成一个简单动作。一个自然的方法是使用一个command对象来封

    装wizard过程,该command对象在第一个wizard页面显示时被创建,每个wizard页面接收用户输入并设

    置到该command对象中,当最后一个wizard页面用户按下“Finish”按钮时,可以简单地触发一个事件

    调用execute()方法执行整个动作。通过这种方法,command类不包含任何跟用户界面有关的代码,可以

    分离用户界面与具体的处理逻辑。

 

  5 GUI buttons and menu items(GUI按钮与菜单条等等)
    Swing系统里,用户可以通过工具条按钮,菜单按钮执行命令,可以用command对象来封装命令的执行。

 

  6 Thread pools(线程池)
    通常一个典型的线程池实现类可能有一个名为addTask()的public方法,用来添加一项工作任务到任务

    队列中。该任务队列中的所有任务可以用command对象来封装,通常这些command对象会实现一个通用的

    接口比如java.lang.Runnable。

 

  7 Macro recording(宏纪录)
    可以用command对象来封装用户的一个操作,这样系统可以简单通过队列保存一系列的command对象的状

    态就可以记录用户的连续操作。这样通过执行队列中的command对象,就可以完成"Play back"操作了。

 

  8 Networking
    通过网络发送command命令到其他机器上运行。

 

 9 Parallel Processing(并发处理)
    当一个调用共享某个资源并被多个线程并发处理时。

分享到:
评论

相关推荐

    java 23种设计模式及具体例子

    每种模式都有其特点和应用场景。 1. 工厂方法模式(Factory Method) 工厂方法模式分为三种:普通工厂模式、多个工厂方法模式、静态工厂方法模式。 * 普通工厂模式 普通工厂模式是建立一个工厂类,对实现了同一...

    Unreal的控制台命令参数合集

    setbind keyname command 将指定的按键名绑定到给定的控制台命令。 shot 根据屏幕的分辨率(或窗口分辨率,如果游戏在窗口模式下运行)截图。 tiledshot resolutionscale pixeloverlap A high resolution is ...

    研磨设计模式之命令模式

    命令模式(Command)1 场景问题 1.1 如何开机计有些朋友看到这个标题会非常奇怪,电脑装配好了,如何开机?不就是按下启动按钮就可以了吗?难道还有什么玄机不成。对于使用电脑的客户——就是我们来说,开机确实很...

    FIBOCOM Fx650 Series AT Commands_V3.8.3.pdf

    AT命令(AT Command)是一种用于控制和配置无线通信设备的命令语句,AT命令通常以“AT”开头,后面跟着具体的命令参数和值。FIBOCOM Fx650 Series AT Commands handbooks提供了详细的AT命令指南,包括命令格式、参数...

    Neoway_N58_AT命令手册_V1.0.zip

    N58 是一款基于展锐平台的 4G 工业级...该工业级高性能通信数传模组,支持 GSM、LTE-FDD、LTE-TDD(Cat1)网络模式,具有丰富的硬件接口,支持音视频功能和 BT 无线连接,可选支持 GNSS,易于开发,适用于各种场景。

    learning_invariances_in_speech_recognition:在这项工作中,我研究了语音命令任务的开发和深度学习模型的分析。 最先进的技术使用卷积神经网络(CNN),因为它们具有学习与语音相关的表示的内在本质。 特别是,我开发了在Google Speech Command Dataset上训练并在不同场景下经过测试的不同CNN。 语音识别的主要问题在于不同人之间单词发音的差异

    特别是,我开发了在Google Speech Command Dataset上训练并在不同场景下经过测试的不同CNN。 语音识别的一个主要问题在于不同人群之间单词发音的差异:建立可变性不变模型的一种方法是增加扰动输入的数据集。 在这...

    selenium IDE工具界面详解

    它安装和使用都非常简单,适用范围局限,通常被用作原型工具使用,而不是用于开发和维护复杂测试场景的解决方案。 Selenium IDE 的功能简单,但需要基本的 HTML、Javascript 和 DOM(Document Object Model)知识来...

    GameDesignPattern_U3D_Version

    具体Readme请在Asset内分目录查看:[TOC]命令模式使用说明运行后,WASD控制方块运动,场景中Manager勾选掉IsRun,可以实现时光回流的效果。类说明Command抽象基类,包含了时间戳和运行、回退的虚方法...

    adb1.0.26包含fastboot.exe

    Android 设备的开发者选项和 USB 调试模式已开启。 可以到「设置」-「开发者选项」-「Android 调试」查看。 如果在设置里找不到开发者选项,那需要通过一个彩蛋来让它显示出来:在「设置」-「关于手机」连续点击「...

    php cli模式学习(PHP命令行模式)

    php_cli模式简介 php-cli是php Command ...——注:windows和linux下都支持php_cli模式 PHP-cli应用场景: 1.多线程应用 这方面的好处,引用鸟哥的话: 优点: 1. 使用多进程, 子进程结束以后, 内核会负责回收资源 2.

    Spring API

    1.1.1. 使用场景 2. Spring 2.0和 2.5的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 新的bean作用域 2.2.2. 更简单的XML配置 2.2.3. 可扩展的XML编写 2.2.4. Annotation(注解)驱动配置 2.2.5. 在...

    SuperSocket服务器应用程序框架-.net

    应用程序域和进程级别的隔离能够满足你大部分的宿主场景; 内置的 SSL/TLS 加密支持; 会话级别的发送队列能够让你通过会话并发的发送数据,并保持高性能和可控性; SuperSocket 的命令处理模式让你的业务逻辑更清晰,...

    Spring中文帮助文档

    12.5.2. 使用 SqlMapClientTemplate 和 SqlMapClientDaoSupport 12.5.3. 基于原生的iBATIS API的DAO实现 12.6. JPA 12.6.1. 在Spring环境中建立JPA 12.6.2. JpaTemplate 和 JpaDaoSupport 12.6.3. 基于原生的...

    vulcano::volcano: 用更少的努力创建很棒的命令行应用程序

    历史记录:使用向上和向下箭头从您的历史记录中选择一个命令。 注册模块:它可以通过调用注册模块函数来注册一个模块内的所有功能。 它将帮助您防止修改源模块。 词法:当然,我们使用Pygments来做上色你的命

    亮剑.NET深入体验与实战精要2

    15.5.9 Command对象的使用 569 15.5.10 反复地执行SQL语句用 Prepare() 569 15.5.11 分页的数据访问 570 15.5.12 SQL命令的优化 570 15.5.13 tempdb的使用技巧 572 15.5.14 使用视图代替跨库操作 572 15.5.15 尽量...

    亮剑.NET深入体验与实战精要3

    15.5.9 Command对象的使用 569 15.5.10 反复地执行SQL语句用 Prepare() 569 15.5.11 分页的数据访问 570 15.5.12 SQL命令的优化 570 15.5.13 tempdb的使用技巧 572 15.5.14 使用视图代替跨库操作 572 15.5.15 尽量...

    网管教程 从入门到精通软件篇.txt

     如果不带任何参数,diskpart 命令将启动 diskpart 的 Windows 字符模式版本。  /add  创建新的分区。  /delete  删除现有分区。  device_name  要创建或删除分区的设备。设备名称可从 map 命令的输出...

    fast-think:高效、快速的thinkphp开发工具

    fast-think简介fast-think是基于thinkphp封装的,用于快速高效的进行业务开发的模式,包含了自定义的command命令、自定义查询构造器,文档生成器等等。仅仅需要一条MySQL建表语句,代码、注释支持一键自动生成,接口...

    整理后java开发全套达内学习笔记(含练习)

    命令,指令 [kә'mɑ:nd](指挥, 控制) (command-line 命令行) Comments [java] 文本注释 ['kɒments] compile [java] v.编译 [kәm'pail]' Compilation n.编辑[,kɒmpi'leiʃәn] const (保留字) constant n. ...

Global site tag (gtag.js) - Google Analytics