2016-10-19 13 views
0

私はちょうどデザインパターンを学び始めます。一つはコマンドパターンです。このようレストランユースケースのコマンドパターン

http://www.oodesign.com/command-pattern.html https://www.tutorialspoint.com/design_pattern/command_pattern.htm

として、いくつかの材料といくつかのドキュメンテーションを読んだ後、私は、株式売買のためのコマンドパターンを使用してのアイデアを得ました。クライアントはまず、売買したい在庫を決定してから、エージェント/ブローカーにコマンドの実行機能を呼び出させることができます。私はこれが理にかなっていると思う。

もう一つの「古典的な」例はレストランですが、私はかなり混乱します。顧客として、どの料理(レシーバ)がそのアイテムを調理できるか(例ではスープかグリル)を顧客はどのように知ることができますか?私が思うと、料理人は顧客によって決まらない。どのように私はこのアイデアにアプローチする必要があります誰も私を指摘できますか?

ありがとうございます!

答えて

1

私はあなたが正しくレストランの事例について考えていないと思います。顧客は料理人に直接注文することはしません。ウェイトレスは注文をキッチンに持ち込み、キューに入れて、料理を注文することができます。

コードでは、これはウェイトレスが追加する共有キューのように見え、クックは何かを調理してから調理することができる連続ループにあります。この例のコマンドパターンは、単に顧客から台所に転送される順序です。

+0

ありがとうございました!次に、この例では、具体的なコマンド(オーダー)は、オーダーの準備ができる料理オブジェクトへの参照を持っていますか?ある場合、具体的なコマンドがインスタンス化されると(顧客/クライアントによって)、インスタンス化のためのCookオブジェクトを持つ必要がありますが、これは正しいですか? – Lubor

+0

この例の順序は、渡されるオブジェクトにすぎません。それがクックに達する方法は、メッセージの通行人、この場合はウェイトレスおよび/または注文を保持するラックを通してです。 – Lorenzo

1

実際に、あなたの質問は、コマンドパターンが実際に解決しようとしている問題の範囲外です。

Javaに精通している場合は、Command Javaスレッドのパターンを簡単に理解できます。実際には、Thread.run()(run()だけでなく)はコマンドパターンです。

主な考え方は、重要な機能を持ついくつかのオブジェクト群(Commandインタフェースを拡張する具体的なCommandオブジェクト)がある場合は、メソッドのパラメータや型で固定されていないメソッドで実装します。その機能を実行したい任意の起動者(CommandHandler)が実際のクラスが何であるかを知らなくても実際に実行できるようにします。それはsomeCommandObject.execute();を実行することができます。コマンドインタフェースのインスタンスになることだけが要求されます。

Javaスレッドの例では、JVM /オペレーティングシステムについて考えてみましょう。どのプログラムも、実行中のプログラムがそのスレッドのプロセスとして存在するスレッドとしてそのレベルに移行することがわかります。そのスレッド実行部がanyThread.start()ことによって、任意のスレッド処理を実行できるように、レストランの例で等

anyThread.sleep()は、実際のコマンドオブジェクトは、CommandHandlerがWaiterSoupOrderGrillOrder等です。 Commandクラスの子でLunchOrderという別のコマンドオブジェクトを導入し、void execute(){}を実装する状況を考えてみましょう。今では、呼び出し元(Waiter)に変更を加える必要はありません。なぜなら、依然としてlunchOrder.execute()を呼び出すことができるからです。したがって、パブリッシャ(コマンドオブジェクト)とクライアント(インボーカ)の実装は切り離されています。それはコマンドパターンの美しさです。

thisも参照してください。 :))

関連する問題