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模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在Java编程中,这种模式常用于解耦调用者和接收者,使得系统...
Command模式是一种行为设计模式,它的主要目的是将命令的发起者(Invoker)与命令的执行者(Receiver)解耦。在Command模式中,一个命令对象封装了特定的请求,调用者(Invoker)只需要知道如何发送命令,而无需知道...
创建模式: 设计模式之Factory 设计模式之Prototype(原型) ...设计模式之Command 设计模式之State 设计模式之Strategy(策略) 设计模式之Mediator(中介者) 设计模式之Interpreter(解释器) 设计模式之Visitor
设计模式参考文档 创建模式: 设计模式之Factory 设计模式之Prototype...设计模式之Command 设计模式之State 设计模式之Strategy(策略) 设计模式之Mediator(中介者) 设计模式之Interpreter(解释器) 设计模式之Visitor
在“设计模式-command”中,我们看到这个模式的应用,通过将一个操作封装为一个对象(即命令对象),使得发送者可以无需知道接收者的具体实现,只需要知道如何发送命令即可。这种松耦合使得系统更易于维护和扩展。 ...
设计模式之 Command(命令) 什么是将行为封装,Command 是最好的说明. 设计模式之 Observer(观察者) 介绍如何使用 Java API 提供的现成 Observer 设计模式之 Iterator(迭代器) 这个模式已经被整合入Java的...
命令模式是一种行为设计模式,它将请求封装成独立的对象,使得可以使用不同的请求、队列请求、记录请求历史以及支持可撤销的操作。这种模式在软件工程中被广泛应用,尤其是在需要解耦请求发起者和接收者时,提高了...
Command模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在Java编程中,这种模式被广泛应用于实现命令行操作、GUI事件...
**C++设计模式:命令模式** 命令模式是一种行为设计模式,它将请求封装为一个对象,使得你可以使用不同的请求、队列或者记录请求日志,同时支持可撤销的操作。在C++编程中,命令模式是一种非常实用的设计模式,能够...
在这个“设计模式之美”的学习笔记中,我们将探讨一些主要的设计模式,以及它们在实际开发中的应用。 首先,我们从创建型模式开始。这类模式主要用于对象的创建,如单例模式(Singleton)、工厂模式(Factory ...
具体到“设计模式学习之Command模式”的学习资料,8页的PDF可能涵盖了Command模式的基本概念、结构、使用示例以及与其他设计模式的比较等内容。学习这部分资料,读者可以深入理解Command模式的原理,并学会如何在...
C#设计模式之Command,指的是命令模式。在这个模式中,我们将一个请求封装为一个对象,使得我们可以参数化不同请求,对请求排队或记录请求日志,以及支持可撤销的操作。在C#中,命令模式常用于GUI编程,可以将用户...
### 设计模式-COMMAND #### 一、概述 **命令模式(Command Pattern)** 是一种行为设计模式,它将请求封装成对象,从而使你能够用不同的请求对客户端进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 ...
命令模式是一种行为设计模式,它的主要目的是将请求者与接收者解耦,使得请求的发起者无需知道哪个对象会执行这个请求,同时也让系统更容易扩展。这种模式在软件工程中广泛应用,特别是在事件驱动和分布式系统中。 ...
命令模式(Command Pattern)是一种行为型设计模式,它将请求封装为对象,从而使您可以使用不同的请求、队列请求或日志请求,并支持可撤销操作。命令模式通常用于实现操作的解耦,使得发送者和接收者之间不直接关联...
命令模式是一种行为设计模式,它将请求封装为一个对象,使得我们可以使用不同的请求、队列或者记录请求日志,还可以支持可撤销的操作。在命令模式中,我们创建表示各种操作的类以及能执行这些操作的对象。这种模式的...
《Java设计模式之禅》是一本深入浅出讲解设计模式的书籍,书中不仅包含23种经典设计模式的案例,还详细介绍了设计模式背后的思想和原则,适合初学者以及对设计模式有一定了解的程序员阅读。本书旨在帮助读者理解如何...
Command设计模式是一种行为设计模式,它将请求封装为一个对象,使得你可以参数化不同请求,对请求排队或者记录请求日志,以及支持可撤销的操作。在.NET开发中,C#语言是实现这种模式的理想选择,因为它提供了丰富的...