2013-10-30 58 views
2

我正在學習設計模式,並且我對命令模式有疑問:我不明白爲什麼我看到每個類圖(例如,看看這個: http://en.wikipedia.org/wiki/Command_patternhttp://www.oodesign.com/command-pattern.html)不顯示Client和Invoker之間的關係,因爲客戶端創建了Invoker類的實例。命令模式:客戶端和調用者之間的關係

在此先感謝。

編輯: 有人可以發佈一個簡單的例子來說明如何實現一個沒有實例化調用者的客戶端,但它只負責處理具體的命令和接收器?

+2

這個問題似乎是離題,因爲它應該是http://programmers.stackexchange.com/ –

回答

1

這是因爲可能有一個關係,但沒有關係必須。

例子:

首先我們有一個Command接口

public interface Command { 
    void execute(); 
} 

一些implentations ...

public class CopyFilesCommand implements Command { 

    @Override 
    public void execute() { 
     // copy some files 
    } 
} 

public class ZipFilesCommand implements Command { 

    @Override 
    public void execute() { 
     // collect the copied files to a zip archive 
    } 
} 

public class MailZipFileCommand implements Command { 

    @Override 
    public void execute() { 
     // mail the zip file to some address 
    } 
} 

現在想象用基本配置

public class Config { 
    private static final Config INSTANCE = new Config(); 

    private List<Command> commands = new ArrayList<>(); 

    private Config() { 
     // intentionally empty 
    } 

    public static List<Command> getCommands() { 
     return Collections.unmodifiableList(INSTANCE.commands); 
    } 

    public static void addCommand(Command command) { 
     INSTANCE.commands.add(command); 
    } 
} 
服務器應用程序

客戶方法現在可以設置這樣

public class Client { 
    public void setUpConfig() { 
     Config.addCommand(new CopyFilesCommand()); 
     Config.addCommand(new ZipFilesCommand()); 
     Config.addCommand(new MailZipFileCommand()); 
    } 
} 

和我們的服務器應用程序則可以採取命令和調用它們

public class Invoker implements Runnable { 

    @Override 
    public void run() { 
     for (Command command : Config.getCommands()) { 
      command.execute(); 
     } 
    } 
} 

你看到客戶端和祈求不要內運行某些服務的配置彼此瞭解(即他們沒有關係),但仍然使用他們都知道的命令一起工作。

+0

我還是有點困惑。我無法想象客戶端不負責創建和使用Invoker類實例的場景。可能我不明白你的例子。 – jbdotdev

+0

我已經整合了我的評論。我在完成之前按下回車鍵。 – jbdotdev

相關問題