JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Software Design » GoF  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
作者 Design Patterns 入門 - 命令(Command) [精華]
caterpillar

良葛格

版主

發文: 2613
積分: 70
於 2004-01-10 18:25 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
此文件已有新版
http://openhome.cc/Gossip/DesignPattern/

如果您寫過Java的Swing視窗程式,您應該使用過命令(Command)模式了,例如在您按下JMenuItem的「剪下」選項時,執行對JTextArea的選定文字之剪下動作,並將狀態列設定為文件已修改狀態。

Java的設計人員在設計Java的類別庫之前,是不可能知道您所要發送請求的接收者的訊息的,他們必須設計一個通用的架構,以在不知道後續使用者發送請求的接收者任何訊息下,也可以讓您自行組合以完成需求,他們採用了命令模式。

以方才提過的例子,一個實作的片段可能像是這樣:
1
2
3
4
5
6
7
        menuCut.addActionListener(
            new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    textArea.cut();   // textArea 是 JTextArea的一個實例n                    isModified = true;
                    stateBar.setText("已修改");  // stateBar是JLabel的一個實例n                }
            }
        );


上面個這片段採用的是Java的匿名類別(Anonymous class),一個不具名的類別實作了ActionListener介面,它只有一個方法actionPerformed(),我們使用addActionListener()為JMenuItem加入這個類別的實例,一但這個JMenuItem被按下,它就會調用actionPerformed()方法,以執行您所定義的工作。



Java的人員定義了統一的呼叫方法,並將方法中的實作留待您來實作,Java不用知道接下來您要呼叫的物件是誰,它只要呼叫actionPerformed()就對了,像這樣將請求封裝起來的模式,就是命令模式。

命令模式將請求封裝起來,將實作部份留待使用者實作,其UML結構圖如下所示:


使用命令模式,您可以在不知道接收請求的物件之詳細情況下,執行正確的操作,例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public interface Command {
    public abstract void execute();
}
 
public class ConcreteCommand1 implements Command {
    public void execute() {
        System.out.println("execute concrete command1");
    }
}
 
public class ConcreteCommand2 implements Command {
    public void execute() {
        System.out.println("execute concrete command2");
    }
}
 
public class ConcreteCommand3 implements Command {
    public void execute() {
        System.out.println("execute concrete command3");
    }
}
 
import java.util.*;
                                                                                
public class Main {
    public static void main(String[] args) {
        ArrayList arrayList = new ArrayList();
        arrayList.add(new ConcreteCommand1());
        arrayList.add(new ConcreteCommand2());
        arrayList.add(new ConcreteCommand3());
                                                                                
        Iterator it = arrayList.iterator();
        while(it.hasNext())
            ((Command)it.next()).execute();
    }
}


執行結果:
1
2
3
execute concrete command1
execute concrete command2
execute concrete command3


在取出ArrayList中的物件之時,我們已經無法確定每個物件的真正形態為何,我們可以確定的就是它為Command的子類,並有一個統一的execute()介面可以呼叫,所以仍然可以正確的執行每個請求物件的要求。

由這個例子可以延伸的是,如果您在每個物件中記錄操作前後的狀態變化,並將每個請求儲存在一個佇列中,並藉由一個指針來表示目前執行到哪一個請求,就可以完成 Redo/Undo 的功能。


caterpillar edited on 2013-04-07 15:58
reply to postreply to post
良葛格學習筆記
作者 Re:Design Patterns 入門 - 命令(Command) [Re:caterpillar]
stanley





發文: 73
積分: 0
於 2006-06-06 16:30 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
請問這個pattern是不是只適用於Window的程式?

web可以用嗎? 怎麼用比較好?


reply to postreply to post
作者 Re:Design Patterns 入門 - 命令(Command) [Re:stanley]
yaocl





發文: 101
積分: 4
於 2006-06-07 01:25 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
參考 J2EE Pattern: View Helper http://java.sun.com/blueprints/corej2eepatterns/Patterns/ViewHelper.html
就有提到如何在Helper 裡面使用 Command

而在 Service to Worker or Dispatcher View 可看到整合的sample code
http://java.sun.com/blueprints/corej2eepatterns/Patterns/ServiceToWorker.html

我們是使用 Service to Worker

stanley wrote:
請問這個pattern是不是只適用於Window的程式?

web可以用嗎? 怎麼用比較好?


reply to postreply to post
Sandglass Principle
作者 Re:Design Patterns 入門 - 命令(Command) [Re:caterpillar]
saintlu





發文: 1
積分: 0
於 2006-09-14 19:08 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
不错。不错

reply to postreply to post
作者 Re:Design Patterns 入門 - 命令(Command) [Re:caterpillar]
aleng





發文: 2
積分: 0
於 2006-12-08 20:49 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
不错。不错
收藏先


reply to postreply to post
数据恢复raid数据恢复工作者在上海数据恢复
» JWorld@TW »  Software Design » GoF

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8