コマンドモードとは
コマンドモードは、リクエスト(コマンド)をオブジェクトとしてカプセル化するため、さまざまなリクエストを使用して他のオブジェクトをパラメーター化(さまざまなリクエストの依存関係を他のオブジェクトに注入)でき、リクエストのキューイング実行(コマンド)、ログの記録、取り消しなどをサポートできます(追加制御)機能。
戦略モードと同様に、コーディングを使用してモードを区別することはできませんが、アプリケーションのシナリオ
コードの実装
/ ** *抽象コマンド * / public interface Command { void execute(); } / ** *特定のコマンド処理 * / public class GotDiamondCommand implements Command { // メンバー変数を省略 public GotDiamondCommand(/ * Data * / ){ // ... } @Override public void execute(){ // 対応するロジックを実行 } } // GotStartCommand / HitObstacleCommand / ArchiveCommandクラス パブリック クラスを省略GameApplication { private static final int MAX_HANDLED_REQ_COUNT_PER_LOOP = 100 ; // コマンドをキューに 保存するprivate Queue <Command> queue = new LinkedList <> (); public void mainloop(){ while(true ){ List <Request> requests = new ArrayList <> (); // 要求にファイルディスクリプタを省略または取得されたデータから選択し、論理パッケージ // 注意タイムアウト設定、要求を長時間受信されない場合、続行するには、以下の論理処理。 for (リクエストリクエスト:リクエスト){ イベントイベント =request.getEvent(); コマンドcommand = null ; もし(event.equals(Event.GOT_DIAMOND)){ コマンド = 新しい GotDiamondCommand(/ * 数据* / )。 } そう であれば(event.equals(Event.GOT_STAR)){ コマンド = 新しい GotStartCommand(/ * 数据* / )。 } else if (event.equals(Event.HIT_OBSTACLE)){ command = newHitObstacleCommand(/ * data * / ); } else if (event.equals(Event.ARCHIVE)){ command = new ArchiveCommand(/ * data * / ); } // ... else if ... キューの 束。追加(コマンド); } int型 handledCount = 0 ; / ** *トラバースを実行 * / ながら(handledCount < MAX_HANDLED_REQ_COUNT_PER_LOOP){ IF (queue.isEmpty()){ BREAK; } コマンドのコマンド = queue.poll()。 command.execute(); } } } }