设计模式之命令(Command)模式

本文详细介绍了命令模式的概念及其在软件开发中的应用。通过实例说明如何将命令封装为对象,实现发送者与接收者的解耦,提高代码的健壮性和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

是不是有点迷糊。不知其说的是啥。哈哈。别着急下面听我慢慢到来。

 

本人觉得,命令模式就是把一些具体的命令封装成一此具体的类,这此类实现同一个接口或者是抽象类。然后把这些类组织到起,然后统一来执行,完成一个具体的业务流程。

 

它的优点是:解藉了发送者与接收者之间的联系。发送者调用一个操作,接收者接受请求执行相应的动作,说白了就是调用一个具体的类来执行相应的方法。因为使用Command模式解耦,发送者无需知道接受者任何接口。

比如说,对文件进行操作,如打开、关闭、打印。正常的操作就是用户点击“打开”按纽,就执行打开命令,在按纽的单击事件中写个方法就可以了。但如要应用Command模式,就要把其抽象出接口,把这三个操作封装成单独的类。也许有人要问,为什么要把简单的问题复杂化呢?。虽然在代码量上有所增加,这样做有利于代码的健壮性 可维护性 还有复用性。这是前人总结出来的经验。

 

说了半天,如何使用呢,别说费话了,“必需的”。

 

具体的Command模式代码各式各样,因为如何封装命令,不同系统,有不同的做法。

典型的Command模式需要有一个接口.接口中有一个统一的方法,这就是"将命令/请求封装为对象。

 

public interface Command {
  public abstract void execute ( );
} 

 

具体不同命令/请求代码是实现接口Command,下面有三个具体命令(打开命令、关闭命令、打印命令)

 

public class Open implements Command {

  public void execute( ) {
          System.out.println("打开");
  }
} 
public class Close implements Command {

  public void execute( ) {
          System.out.println("关闭");
  }
}

public class Print implements Command {

  public void execute( ) {
          System.out.println("打印");
  }
}

 

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

public class producer{
  public static List produceRequests() {
    List queue = new ArrayList();
    queue.add( new Open() );
    queue.add( new Close() );
    queue.add( new Print() );
    return queue; 
  }

}


这三个命令进入List中后,已经失去了其外表特征,以后再取出,也可能无法分辨出谁是Open谁是Close了,看下面客户端如何调用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过一遍"的做法.这种做法只是为了演示.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值