デザインパターン-動作-コマンドパターン(34)

コマンドモードとは

コマンドモードは、リクエスト(コマンド)をオブジェクトとしてカプセル化するため、さまざまなリクエストを使用して他のオブジェクトをパラメーター化(さまざまなリクエストの依存関係を他のオブジェクトに注入)でき、リクエストのキューイング実行(コマンド)、ログの記録、取り消しなどをサポートできます(追加制御)機能。

戦略モードと同様に、コーディングを使用してモードを区別することはできませんが、アプリケーションのシナリオ

 

コードの実装

/ ** 
 *抽象コマンド
 * / 
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(){
         whiletrue ){ 
            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(); 
            } 
        } 
    } 
}

 

おすすめ

転載: www.cnblogs.com/LQBlog/p/12742528.html