デザインパターンを覚えたい (Command)

Commandパターン

種々のコマンドをクラスとして表現するパターン。ポイントは、

  • 各コマンドに対してクラスを割り当てることでコマンドの追加・管理が容易になる
  • 共通の実行形式にすることで、タスクリストによる逐次処理とかが実装しやすい

とかかなぁ。うーん、個人的にうまくメリットを整理できてない。コマンドをクラスにしているのが最大のポイント?やってる事自体は普通な気がしたりしてます。

実装。ls, pwd, cdを持つ簡易コンソール作ります。
http://dl.dropbox.com/u/7810000/code/design_pattern/command.zip

実行。抜けるときはexit。

$ ./run.sh
console> pwd
/Users/xxx/tmp/command
console> ls
### /Users/xxx/tmp/command ###
build.xml
classes
run.sh
src
console> cd src
console> pwd
/Users/xxx/tmp/command/src
console> ls . .. console
### /Users/xxx/tmp/command/src/. ###
console
Main.java
### /Users/xxx/tmp/command/src/.. ###
build.xml
classes
run.sh
src
### /Users/xxx/tmp/command/src/console ###
command
Console.java
console> exit

ポイントはcommandの実行部分かな。どのコマンドも同じ方法で実行している。

public class Console {
    public void execute() {
        try {
            BufferedReader input = new BufferedReader(new InputStreamReader(System.in));

            String line;
            System.out.print("console> ");
            while ((line = input.readLine()) != null) {
                String[] inputs = line.split(" ");

                if (inputs.length < 1) {
                    showUsage();
                }

                if (inputs[0].equals("exit")) {
                    break;
                }
                else {
                    CommandFactory factory = CommandFactory.getInstance();
                    Command command = factory.getCommand(inputs[0]);
                    if (command != null) {
                        int argNum = inputs.length - 1;
                        String[] args = new String[argNum];
                        for (int i=1; i<inputs.length; i++) {
                            args[i-1] = inputs[i];
                        }

                        /* コマンドは違っても実行方法は同じ */
                        command.execute(args);
                    } else {
                        showUsage();
                    }
                }

                System.out.print("console> ");
            }

            input.close();

        } catch (Exception e) {
            System.out.println("Exception: " + e);
        }
    }

    private void showUsage() {
        System.out.println("### possible command list ###");
        System.out.println("pwd           : show current directory");
        System.out.println("cd path       : change directory");
        System.out.println("ls [path ...] : listup files");
        System.out.println("exit          : terminate this console");
    }
}

うーん、しかしこの実装、本のクラス図と結構形が違う気がしなくもない。もしかしてなにかCommandパターンの実装間違ってたりして。