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 Pattern)** 是一种行为设计模式,它将请求封装成对象,从而使你能够用不同的请求对客户端进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 在软件开发中,特别是面向对象编程语言...
命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在极客学院的课程中,这个主题深入讲解了如何使用命令模式来提高...
在软件设计模式的世界里,`Command`(命令)和`Facade`(外观)模式是非常重要的两种设计模式。它们分别服务于不同的目的,但都是为了提高代码的可读性、可维护性和灵活性。 `Command`模式是一种行为设计模式,它将...
命令模式也是一种行为设计模式,它将一个请求封装为一个对象,从而使我们可用不同的请求把客户端参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 ##### 3.1 特点 - **封装性**: 将请求封装成对象,便于...
命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在本示例"命令模式demo"中,我们将深入理解这一模式的实现与应用...
命令模式是一种行为设计模式,它的核心思想是将一个请求封装为一个对象,使得发送者可以独立于接收者来发出请求,同时将命令的执行逻辑与命令的声明分离。在Java中,这种模式常用于实现灵活的系统架构,因为它能够...
### Java设计模式详解 #### 策略模式 (Strategy Pattern) **定义:** 策略模式定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换。该模式让算法的变化独立于使用算法的客户。 **应用场景:** 当一...
以上介绍了23种常见的Java设计模式,每种模式都有其特定的应用场景和优点。理解并掌握这些设计模式对于提高代码质量、增强程序的可维护性和可扩展性等方面具有重要意义。在实际开发过程中,根据具体需求合理选择和...
12. **设计模式**:虽然这是一个简单的项目,但可以引入一些设计模式,如命令模式(Command Pattern)来处理文本编辑的操作,这样可以使代码更易于维护和扩展。 通过实现MiniEditor,开发者不仅可以掌握Java GUI...
本压缩包中的资源聚焦于使用Java语言实现的设计模式,尽管Java是主要平台,但设计模式的原则和结构在其他面向对象语言中同样适用。 1. **单例模式(Singleton)**:确保一个类只有一个实例,并提供全局访问点。在...
- `String command`:用于记录操作命令。 - `String[] s1, s2`:按钮文本数组。 3. **构造方法**: - 构造方法中完成了界面的基本搭建,包括面板、文本框、按钮、菜单等元素的创建与添加。 4. **主方法**: - ...
此外,考虑到撤销/重做功能,开发者可能使用了Command设计模式,每项用户操作都会被封装成一个命令对象,然后在需要时执行或撤销该命令。这为用户提供了一种方便的方式来恢复之前的文本状态。 总的来说,这个【Java...
7. 设计模式:可能用到了Command模式实现撤销/重做。 8. 软件工程:项目组织和版本控制。 对于学习者来说,这是一个很好的实践项目,涵盖了Java GUI编程的基础和一些进阶概念,有助于提升实际编程技能。
程序通过状态变量start来判断是否为数字输入的开始,通过lastCommand保存最近的操作命令,result存储计算结果。 10. **异常处理**:在实际编程中,还需要考虑输入有效性检查和异常处理,例如,防止除以零、无效日期...
3. **Command类**:用于在Displayable上添加按钮或菜单项,用户可以通过点击这些命令进行操作。 4. **Notification**:用于在设备的状态栏显示提示信息。 5. **RecordStore**:提供持久化数据存储的能力,游戏进度或...
4. **模型-视图-控制器(MVC)**:Swing遵循MVC设计模式,将数据模型、用户界面(视图)和业务逻辑(控制器)分离,这有利于代码的维护和扩展。例如,JTable和DefaultTableModel的组合就是MVC模式的一个应用,模型...