`
flysky
  • 浏览: 65410 次
社区版块
存档分类
最新评论

设计模式之Command(zz)

    博客分类:
  • java
阅读更多
板桥里人 http://www.jdon.com 2002/4/23/(转载请保留)

模式实战书籍《Java实用系统开发指南》

Command 模式是最让我疑惑的一个模式,我在阅读了很多代码后,才感觉隐约掌握其大概原理,我认为理解设计模式最主要是掌握起原理构造,这样才对自己实际编程有指导作用.Command模式实际上不是个很具体,规定很多的模式,正是这个灵活性,让人有些confuse.

Command定义
n 将来自客户端的请求传入一个对象,无需了解这个请求激活的 动作或有关接受这个请求的处理细节。

这是一种两台机器之间通讯联系性质的模式,类似传统过程语 言的 CallBack功能。

优点:
解耦了发送者和接受者之间联系。 发送者调用一个操作,接受者接受请求执行相应的动作,因为使用Command模式解耦,发送者无需知道接受者任何接口。

不少Command模式的代码都是针对图形界面的,它实际就是菜单命令,我们在一个下拉菜单选择一个命令时,然后会执行一些动作.

将这些命令封装成在一个类中,然后用户(调用者)再对这个类进行操作,这就是Command模式,换句话说,本来用户(调用者)是直接调用这些命令的,如菜单上打开文档(调用者),就直接指向打开文档的代码,使用Command模式,就是在这两者之间增加一个中间者,将这种直接关系拗断,同时两者之间都隔离,基本没有关系了.

显然这样做的好处是符合封装的特性,降低耦合度,Command是将对行为进行封装的典型模式,Factory是将创建进行封装的模式,
从Command模式,我也发现设计模式一个"通病":好象喜欢将简单的问题复杂化, 喜欢在不同类中增加第三者,当然这样做有利于代码的健壮性 可维护性 还有复用性.

如何使用?
具体的Command模式代码各式各样,因为如何封装命令,不同系统,有不同的做法.下面事例是将命令封装在一个Collection的List中,任何对象一旦加入List中,实际上装入了一个封闭的黑盒中,对象的特性消失了,只有取出时,才有可能模糊的分辨出:
典型的Command模式需要有一个接口.接口中有一个统一的方法,这就是"将命令/请求封装为对象":
public interface Command {
  public abstract void execute ( );
}

具体不同命令/请求代码是实现接口Command,下面有三个具体命令
public class Engineer implements Command {

  public void execute( ) {
    //do Engineer's command
  }
}

public class Programmer implements Command {

  public void execute( ) {
    //do programmer's command
  }
}

public class Politician implements Command {

  public void execute( ) {
    //do Politician's command
  }
}

按照通常做法,我们就可以直接调用这三个Command,但是使用Command模式,我们要将他们封装起来,扔到黑盒子List里去:

public class producer{
  public static List produceRequests() {
    List queue = new ArrayList();
    queue.add( new DomesticEngineer() );
    queue.add( new Politician() );
    queue.add( new Programmer() );
    return queue;
  }

}

这三个命令进入List中后,已经失去了其外表特征,以后再取出,也可能无法分辨出谁是Engineer 谁是Programmer了,看下面客户端如何调用Command模式:

public class TestCommand {
  public static void main(String[] args) {
    
    List queue = Producer.produceRequests();
    for (Iterator it = queue.iterator(); it.hasNext(); )
      
 //客户端直接调用execute方法,无需知道被调用者的其它更多类的方法名。
        ((Command)it.next()).execute();
  

  }
}

由此可见,调用者基本只和接口打交道,不合具体实现交互,这也体现了一个原则,面向接口编程,这样,以后增加第四个具体命令时,就不必修改调用者TestCommand中的代码了.

理解了上面的代码的核心原理,在使用中,就应该各人有自己方法了,特别是在如何分离调用者和具体命令上,有很多实现方法,上面的代码是使用"从List过一遍"的做法.这种做法只是为了演示.

使用Command模式的一个好理由还因为它能实现Undo功能.每个具体命令都可以记住它刚刚执行的动作,并且在需要时恢复.

Command模式在界面设计中应用广泛.Java的Swing中菜单命令都是使用Command模式,由于Java在界面设计的性能上还有欠缺,因此界面设计具体代码我们就不讨论,网络上有很多这样的示例.

参考:
http://www.patterndepot.com/put/8/command.pdf

http://www.javaworld.com/javaworld/javatips/jw-javatip68.html

命令模式---我的理解

设计模式如何在具体项目中应用见《Java实用系统开发指南》
分享到:
评论

相关推荐

    JAVA常用设计模式-追美眉技术详解.doc

    ### Java常用设计模式—追美眉技术详解 #### 设计模式概述 设计模式是一种软件设计中的通用解决方案,它描述了一类问题以及解决该问题的方法。通过应用这些模式,开发人员可以编写出更易于理解、扩展和维护的代码...

    VIM全彩色键盘图(学习VI或VIM必备)

    在VIM中,操作主要分为三种模式:正常模式(Normal mode)、插入模式(Insert mode)和命令行模式(Command-line mode)。正常模式下,用户可以通过键盘上的不同按键组合执行各种编辑操作,如移动光标、复制、粘贴、...

    实验二_vi基础与文件目录操作.docx

    vi编辑器分为两种主要模式:命令模式(Command mode)和插入模式(Insert mode)。命令模式主要用于执行编辑命令,如移动光标、删除文本等;插入模式则用于输入文本。用户可以通过简单的键盘操作在两种模式之间快速切换...

    vim练习及攻略

    - ESC:从Insert模式或Command-line模式切换回Normal模式。 - x:删除当前光标下的字符。 - :wq:保存文件并退出Vim。 - dd:删除当前行。 - p:粘贴。 - hjkl:移动光标(分别对应左、下、上、右)。 4. 插入模式...

    linux基础.pdf

    command`:执行shell命令`command`。 - **查找与替换**: - `:s/p1/p2/g`:将当前行中的所有`p1`替换为`p2`。 - `:n1,n2 s/p1/p2/g`:将n1行到n2行中的所有`p1`替换为`p2`。 以上是对vi编辑器的基础介绍及其基本...

    2009 达内Unix学习笔记

    (注 删除没有写权限的文件可以用 rm -f ,这是为了操作方便,是人性化的设计)。 x 执行权限;对目录,是进入该目录 - 表示没有权限 形式 - rw- r-- r-- 其中 第一个是文件类型(-表普通文件,d表目录,l表软...

    unix下VI的使用详解,尽情发挥你的想像,快快来下吧

    VI提供了两种主要的操作模式:指令模式(Command Mode)和输入模式(Input Mode)。 ##### 1. 指令模式 - 在指令模式下,用户可以通过键盘输入特定的命令来控制编辑器的行为,如移动光标、复制、删除等。 - **光标移动*...

    8051Proteus仿真c源码12864LCD显示计算器键盘按键实验

    // 设置显示模式为8位数据长度、2行显示、5x10点阵字符大小 write_command(0x0C); // 显示开关控制:显示开、光标关、光标闪烁关 write_command(0x01); // 清屏命令 write_command(0x80); // 设置DDRAM地址指针...

    Linux命令大全

    在Linux系统中,`vi`(Visual Editor)是一种非常强大的文本编辑器,它最初为Unix系统设计,并被广泛应用于各种类Unix操作系统中,包括Linux。由于其功能强大、启动速度快以及对资源消耗较低的特点,在Linux环境下...

    Python3项目开发学生管理系统的程序

    整个学生管理系统采用MVC(Model-View-Controller)架构模式: - **模型层(Model)**:负责数据逻辑处理,如对数据库的操作。 - **视图层(View)**:负责用户界面展示,如输入框、按钮等元素。 - **控制器层...

Global site tag (gtag.js) - Google Analytics