2009-05-20 21 views
1

在命令模式中:命令模式:客戶端和調用者

爲什麼客戶端參與者不應該與調用者參與者具有相同的類?當客戶參與者和調用者參與者可以是同一個類時,是否有可能的情景?

+0

[Command Design Pattern - Is Invoker Optional?]的可能的副本(http://stackoverflow.com/questions/12879609/command-design-pattern-is-invoker-optional)。這是更早,但其他有更多的信息。 – outis 2015-07-18 21:03:18

回答

4

最大的原因是它違反了單一責任原則。客戶參與者和調解者參與者都有各自的責任,並且對其中一個的改變會影響另一個。

0

1)客戶的主要責任是正確實施Invoker,Receiver和Command對象,然後在適當的地點和時間啓動執行程序。

它可以,例如,是這樣的祈求這個

class Client { 

... 

invoker.executeCommand() 

... 

} 

2)主要職責是在調用特定的順序Command對象的一個​​或多個命令的方法。

例如,

class Invoker { 

... 
command.command1(); 
command.command2(); 
command.command3(); 
... 

} 

讓我們考慮,例如,java.awt.event.KeyListener類。它是按照下面的順序調用三種方法:

keyPressed(KeyEvent e) 
keyTyped(KeyEvent e) 
keyReleased(KeyEvent e) 

這個監聽器祈求類可能是:正確實例化的EventObject,KeyListener的和KeyInvocation然後

class KeyInvocation { 
    KeyListener listener; 

    void invokeKey(EventObject e) { 
     listener.keyPressed(e); 
     listener.keyTyped(e); 
     listener.keyReleased(e); 
    } 
} 

與此同時Client類應在適當的執行地點和時間invokeKey方法。

當然,Invoker是命令模式的附加層。 在Command模式更簡單的情況下,我們可以跳過Invoker類並完成客戶端的所有工作。