`

設計模式之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 功能。每個具體命令都可以記住它剛剛執行的動作 , 並且在需要時恢復。

Command 模式在介面設計中應用廣泛。 Java Swing 中功能表命令都是使用 Command 模式 , 由於 Java 在介面設計的性能上還有欠缺 , 因此介面設計具體代碼我們就不討論 , 網路上有很多這樣的示例。

分享到:
评论

相关推荐

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

    **设计模式之Command(命令)模式** Command模式是一种行为设计模式,它将请求封装为一个对象,使得可以使用不同的请求、队列或者日志请求,同时支持可撤销的操作。这种模式在软件工程中广泛应用于解耦请求的发送者...

    设计模式之Command

    Command模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在Java编程中,这种模式常用于解耦调用者和接收者,使得系统...

    设计模式之Command模式和代码实现

    Command模式是一种行为设计模式,它的主要目的是将命令的发起者(Invoker)与命令的执行者(Receiver)解耦。在Command模式中,一个命令对象封装了特定的请求,调用者(Invoker)只需要知道如何发送命令,而无需知道...

    JAVA设计模式chm文档

    创建模式: 设计模式之Factory 设计模式之Prototype(原型) ...设计模式之Command 设计模式之State 设计模式之Strategy(策略) 设计模式之Mediator(中介者) 设计模式之Interpreter(解释器) 设计模式之Visitor

    设计模式文档 chm

    设计模式参考文档 创建模式: 设计模式之Factory 设计模式之Prototype...设计模式之Command 设计模式之State 设计模式之Strategy(策略) 设计模式之Mediator(中介者) 设计模式之Interpreter(解释器) 设计模式之Visitor

    设计模式-command

    在“设计模式-command”中,我们看到这个模式的应用,通过将一个操作封装为一个对象(即命令对象),使得发送者可以无需知道接收者的具体实现,只需要知道如何发送命令即可。这种松耦合使得系统更易于维护和扩展。 ...

    二十三种设计模式【PDF版】

    设计模式之 Command(命令) 什么是将行为封装,Command 是最好的说明. 设计模式之 Observer(观察者) 介绍如何使用 Java API 提供的现成 Observer 设计模式之 Iterator(迭代器) 这个模式已经被整合入Java的...

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

    命令模式是一种行为设计模式,它将请求封装成独立的对象,使得可以使用不同的请求、队列请求、记录请求历史以及支持可撤销的操作。这种模式在软件工程中被广泛应用,尤其是在需要解耦请求发起者和接收者时,提高了...

    Command模式(Java设计模式)

    Command模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在Java编程中,这种模式被广泛应用于实现命令行操作、GUI事件...

    C++设计模式代码资源23_Command_命令模式.zip

    **C++设计模式:命令模式** 命令模式是一种行为设计模式,它将请求封装为一个对象,使得你可以使用不同的请求、队列或者记录请求日志,同时支持可撤销的操作。在C++编程中,命令模式是一种非常实用的设计模式,能够...

    设计模式之美—学习笔记

    在这个“设计模式之美”的学习笔记中,我们将探讨一些主要的设计模式,以及它们在实际开发中的应用。 首先,我们从创建型模式开始。这类模式主要用于对象的创建,如单例模式(Singleton)、工厂模式(Factory ...

    设计模式学习之Command模式共8页.pdf.zip

    具体到“设计模式学习之Command模式”的学习资料,8页的PDF可能涵盖了Command模式的基本概念、结构、使用示例以及与其他设计模式的比较等内容。学习这部分资料,读者可以深入理解Command模式的原理,并学会如何在...

    设计模式,程序模式思想

    C#设计模式之Command,指的是命令模式。在这个模式中,我们将一个请求封装为一个对象,使得我们可以参数化不同请求,对请求排队或记录请求日志,以及支持可撤销的操作。在C#中,命令模式常用于GUI编程,可以将用户...

    设计模式-COMMAND

    ### 设计模式-COMMAND #### 一、概述 **命令模式(Command Pattern)** 是一种行为设计模式,它将请求封装成对象,从而使你能够用不同的请求对客户端进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 ...

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

    命令模式是一种行为设计模式,它的主要目的是将请求者与接收者解耦,使得请求的发起者无需知道哪个对象会执行这个请求,同时也让系统更容易扩展。这种模式在软件工程中广泛应用,特别是在事件驱动和分布式系统中。 ...

    c++-设计模式之命令模式(Command Pattern)

    命令模式(Command Pattern)是一种行为型设计模式,它将请求封装为对象,从而使您可以使用不同的请求、队列请求或日志请求,并支持可撤销操作。命令模式通常用于实现操作的解耦,使得发送者和接收者之间不直接关联...

    命令模式(Command模式)

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

    Java设计模式之禅

    《Java设计模式之禅》是一本深入浅出讲解设计模式的书籍,书中不仅包含23种经典设计模式的案例,还详细介绍了设计模式背后的思想和原则,适合初学者以及对设计模式有一定了解的程序员阅读。本书旨在帮助读者理解如何...

    Command设计模式搭建的框架小例子

    Command设计模式是一种行为设计模式,它将请求封装为一个对象,使得你可以参数化不同请求,对请求排队或者记录请求日志,以及支持可撤销的操作。在.NET开发中,C#语言是实现这种模式的理想选择,因为它提供了丰富的...

Global site tag (gtag.js) - Google Analytics