`
holdbelief
  • 浏览: 707517 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java设计模式之Command(菜单命令)

阅读更多

  Command模式是最让我迷惑的一个模式,我在阅读了很多代码后,才感觉隐约把握其大概原理,我认为理解设计模式最主要是把握起原理构造,这样才对自己实际编程有指导作用.Command模式实际上不是个很具体,规定很多的模式,正是这个灵活性,让人有些confuse.
  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 (); )
//取出List中东东,其他特征都不能确定,只能保证一个特征是100%正确,
// 他们至少是接口Command的"儿子".所以强制转换类型为接口Command
     {     
           ((Command )it.next ()).execute ();
     }
  }
}

 

  由此可见,调用者基本只和接口打交道,不合具体实现交互,这也体现了一个原则,面向接口编程,这样,以后增加第四个具体命令时,就不必修改调用者TestCommand中的代码了.
  理解了上面的代码的核心原理,在使用中,就应该各人有自己方法了,非凡是在如何分离调用者和具体命令上,有很多实现方法,上面的代码是使用"从List过一遍"的做法.这种做法只是为了演示.
  使用Command模式的一个好理由还因为它能实现Undo功能.每个具体命令都可以记住它刚刚执行的动作,并且在需要时恢复.

分享到:
评论

相关推荐

    java命令模式示例代码及类图

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在Java中,命令模式的应用非常广泛,尤其在需要解耦调用者和执行...

    命令模式(Command模式)

    命令模式是一种行为设计模式,它将请求封装为一个对象,使得我们可以使用不同的请求、队列或者记录请求日志,还可以支持可撤销的操作。在命令模式中,我们创建表示各种操作的类以及能执行这些操作的对象。这种模式的...

    Java设计模式之命令模式(Command模式)介绍

    命令模式是一种设计模式,它将请求封装为一个对象,使得我们可以使用不同的请求、队列请求、或者支持可撤销的操作。在Java中,命令模式被广泛应用于各种场景,尤其是在需要解耦调用者与具体实现之间关系的时候。接...

    设计模式-COMMAND

    **命令模式(Command Pattern)** 是一种行为设计模式,它将请求封装成对象,从而使你能够用不同的请求对客户端进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 在软件开发中,特别是面向对象编程语言...

    23个设计模式之一的命令模式-极客学院-课件源码

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在极客学院的课程中,这个主题深入讲解了如何使用命令模式来提高...

    Command和Facade设计模式

    在软件设计模式的世界里,`Command`(命令)和`Facade`(外观)模式是非常重要的两种设计模式。它们分别服务于不同的目的,但都是为了提高代码的可读性、可维护性和灵活性。 `Command`模式是一种行为设计模式,它将...

    JAVA责任链与命令模式

    命令模式也是一种行为设计模式,它将一个请求封装为一个对象,从而使我们可用不同的请求把客户端参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 ##### 3.1 特点 - **封装性**: 将请求封装成对象,便于...

    命令模式demo

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在本示例"命令模式demo"中,我们将深入理解这一模式的实现与应用...

    java设计模式

    ### Java设计模式详解 #### 一、概述 Java设计模式是一种在软件开发过程中用来解决常见问题的可重用解决方案。这些模式提供了一种通用的方法来解决问题,并帮助开发者编写出更易于理解、维护和扩展的代码。本文档...

    详解Java设计模式编程中命令模式的项目结构实现

    命令模式是一种行为设计模式,它的核心思想是将一个请求封装为一个对象,使得发送者可以独立于接收者来发出请求,同时将命令的执行逻辑与命令的声明分离。在Java中,这种模式常用于实现灵活的系统架构,因为它能够...

    java开发模式

    以上介绍了23种常见的Java设计模式,每种模式都有其特定的应用场景和优点。理解并掌握这些设计模式对于提高代码质量、增强程序的可维护性和可扩展性等方面具有重要意义。在实际开发过程中,根据具体需求合理选择和...

    用Java设计文本编辑器MiniEditor.zip

    12. **设计模式**:虽然这是一个简单的项目,但可以引入一些设计模式,如命令模式(Command Pattern)来处理文本编辑的操作,这样可以使代码更易于维护和扩展。 通过实现MiniEditor,开发者不仅可以掌握Java GUI...

    设计模式实例

    本压缩包中的资源聚焦于使用Java语言实现的设计模式,尽管Java是主要平台,但设计模式的原则和结构在其他面向对象语言中同样适用。 1. **单例模式(Singleton)**:确保一个类只有一个实例,并提供全局访问点。在...

    计算器java小程序

    - `String command`:用于记录操作命令。 - `String[] s1, s2`:按钮文本数组。 3. **构造方法**: - 构造方法中完成了界面的基本搭建,包括面板、文本框、按钮、菜单等元素的创建与添加。 4. **主方法**: - ...

    Java记事本源代码

    此外,考虑到撤销/重做功能,开发者可能使用了Command设计模式,每项用户操作都会被封装成一个命令对象,然后在需要时执行或撤销该命令。这为用户提供了一种方便的方式来恢复之前的文本状态。 总的来说,这个【Java...

    java 记事本 模仿windows记事本功能

    7. 设计模式:可能用到了Command模式实现撤销/重做。 8. 软件工程:项目组织和版本控制。 对于学习者来说,这是一个很好的实践项目,涵盖了Java GUI编程的基础和一些进阶概念,有助于提升实际编程技能。

    java程序设计报告---设计一个计算器.pdf

    程序通过状态变量start来判断是否为数字输入的开始,通过lastCommand保存最近的操作命令,result存储计算结果。 10. **异常处理**:在实际编程中,还需要考虑输入有效性检查和异常处理,例如,防止除以零、无效日期...

    java游戏编程

    3. **Command类**:用于在Displayable上添加按钮或菜单项,用户可以通过点击这些命令进行操作。 4. **Notification**:用于在设备的状态栏显示提示信息。 5. **RecordStore**:提供持久化数据存储的能力,游戏进度或...

    JavaSwing小程序

    4. **模型-视图-控制器(MVC)**:Swing遵循MVC设计模式,将数据模型、用户界面(视图)和业务逻辑(控制器)分离,这有利于代码的维护和扩展。例如,JTable和DefaultTableModel的组合就是MVC模式的一个应用,模型...

Global site tag (gtag.js) - Google Analytics