デザインパターンを覚えたい (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パターンの実装間違ってたりして。