Charpter23コマンドモード

コマンド・モードの紹介

コマンドモード(コマンド)、カプセル化オブジェクトに対する要求、これ要求の異なるパラメータを使用してクライアントを作る、要求キューまたはログ要求、および取り消し可能操作をサポート。

コマンドモードの利点: 1)彼はより簡単にコマンドキューを設計することができます; 2)ケースをドロップするために必要な、コマンドが比較的容易に記録することができます; 3)1は、受信した要求が拒否権への要求であるかどうかを決定することができます。4)容易に実現し、再実行失効要求することができる; 5)新しいクラスを追加するために、特定のコマンドが他のクラスに影響を与えないため、容易に新しいクラスの特定のコマンドを追加します。6)オブジェクトへのコマンドモード要求とオブジェクトを分離操作を実行する方法を知っています。

アジャイル開発の原則は、私たちはコードの実際の機能が必要とされていないに基づいて推測する追加しないように指示します。あなたは、システムのコマンドが必要かどうかわからない場合は、このモードで必要とされるとき、一般的に、実際には、それを実装するために急いではありません、元のは、そのようなアンドゥ/リドゥ操作やその他の機能として、本当に必要なときにだけ、再建を達成することは困難ではありませんコードのリファクタリングコマンド・モードでは意味があります。

コマンドモードUMLのクラス図

 

UMLクラス図をより容易に特定の実装を理解し

 

  

達成するためのC ++コード

 コードは、UMLクラス図に基づいてプログラムされていない、このモードの理解を容易にするために設計されています

// レシーバ类
#ifndefの_RECEIVER_HPP
 の#define _RECEIVER_HPP 

する#include <iostreamの> 使用して名前空間はstdを、クラス受信{
 パブリックボイドアクション1(){ 
        COUT << " アクション1 " << ENDL。
    } ボイドアクション2(){ 
        COUT << " アクション2 " << ENDL。
    } 
}。#endifの

 


    

// コマンド类
#ifndefの_COMMAND_HPP
 の#define _COMMAND_HPP 
の#include " receiver.hpp " 

クラスコマンド{
 パブリック仮想 無効 excuteは、()= 0を保護
    レシーバー * 受信機。

}。

#endifの
// ConcreteCommand1类
#ifndefの_CONCRETECOMMAND1_HPP
 の#define _CONCRETECOMMAND1_HPP 

の#include " command.hpp " 

クラス ConcreteCommand1:パブリックコマンド{
 パブリック
    ConcreteCommand1(レシーバー * REC){ 
        レシーバ = REC。
    } 

    仮想 ボイド excute()オーバーライド{ 
         レシーバ - > アクション1()。
     } 

}。

#endifの
// ConcreteCommand2类
#ifndefの_CONCRETECOMMAND2_HPP
 の#define _CONCRETECOMMAND2_HPP 

の#include " command.hpp " 

クラス ConcreteCommand2:パブリックコマンド{
 パブリック
    ConcreteCommand2(レシーバー * REC){ 
        レシーバ = REC。
    }。
    仮想 ボイド excute()オーバーライド{ 
        レシーバ - > アクション2()。
    } 

}。

#endifの
// 実行者类
#ifndefの_INVOKER_HPP
 の#define _INVOKER_HPP 

する#include <リスト> 
の#include " command.hpp " 
使用して 名前空間はstdを、
クラスコマンド;
クラスの発動{
 パブリック無効 addCmd(コマンド* CMD){ 
        listCmd.push_back(CMD); 
    } 
    ボイド delCmd(コマンド* CMD){ 
        listCmd.remove_if([ =](コマンド* TMP){ リターン TMP == CMD;}); 
    } 
    ボイドが通知(){
         ための(自動I:listCmd){
            I - > excute(); 
        } 
    } 
プライベート
    リスト <コマンド*> listCmd。
}。

#endifの
// 客户端程序 
する#include <iostreamの> 
の#include " concretecommand1.hpp " 
の#include " concretecommand2.hpp " 
の#include " receiver.hpp " 
の#include " invoker.hpp " 

使用して 名前空間はstdを、
INT メイン(){ 
    レシーバ *レシーバ= 新しい受信機(); 
    ConcreteCommand1 * CMD1 = 新しいConcreteCommand1(受信機)。
    ConcreteCommand2 * CMD2 = 新しいConcreteCommand2(受信機)。
    実行者 *呼び出し=新しい実行者(); 
    呼び出し元 - > addCmd(CMD1)。
    呼び出し元 - > addCmd(CMD1)。
    呼び出し元 - > addCmd(CMD2)。
    インボーカ - > 通知(); 
    裁判所未満 << " --------------- " << てendl; 
    呼び出し元 - > delCmd(CMD1)。
    インボーカ - > 通知(); 
    getchar(); 
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/yb-blogs/p/12616573.html
おすすめ