modo de comando Charpter23

Modo de comando Introducción

El modo de comando (el comando), encapsular una solicitud de un objeto, con lo que sus clientes utilizando diferentes parametrización de la solicitud; la cola de peticiones o solicitudes de registro, y apoyar las operaciones se pueden deshacer.

El modo de comando ventajas: 1) se pueden diseñar más fácilmente una cola de comandos; 2) necesaria para abandonar el caso, el comando puede ser conectado con relativa facilidad; 3) le permite a uno decidir si la petición recibida es una petición a veto. 4) se puede realizar fácilmente y rehacer solicitud de revocación; 5) Dado que los comandos específicos para añadir nueva clase no afectan a otras clases, lo que añade nuevos comandos específicos de clase fácilmente. 6) una solicitud de modo de comando para el objeto y el objeto sabe cómo realizar una operación separada.

principios de desarrollo ágil nos dice que no añadimos que adivinar sobre la base de que no se requiere la función real del código. Si no está seguro si necesita un comando del sistema, en general, no se apresure a ponerlo en práctica, de hecho, cuando sea requerido por esta modalidad no es difícil de lograr la reconstrucción, sólo cuando realmente se necesita, tales como operaciones de deshacer / rehacer y otras funciones, el original código de modo de comando de refactorización tiene sentido.

diagramas de clase UML modo de comando

 

diagrama de clase UML entenderse más fácilmente una implementación particular

 

  

código C ++ para lograr

 El código está diseñado para facilitar la comprensión de este modo no está programado de acuerdo con el diagrama de clases UML

// receptor类
#ifndef _RECEIVER_HPP
 #define _RECEIVER_HPP 

#include <iostream> el uso de espacio de nombres std; clase del receptor {
 público :
     vacío acción1 () { 
        cout << " acción1 " << endl; 
    } Void acción2 () { 
        cout << " acción2 " << endl; 
    } 
}; #terminara si

 


    

// Comando类
#ifndef _COMMAND_HPP
 #define _COMMAND_HPP 
# include " receiver.hpp " 

clase Mando {
 público :
     Virtual  vacío Excute () = 0 ; 
protegida : 
    Receptor * receptor; 

}; 

#terminara si
// ConcreteCommand1类
#ifndef _CONCRETECOMMAND1_HPP
 #define _CONCRETECOMMAND1_HPP 

# include " command.hpp " 

clase ConcreteCommand1: pública Mando {
 público : 
    ConcreteCommand1 (Receptor * REC) { 
        receptor = rec; 
    } 

    Virtual de  vacío Excute () anulación { 
         receptor -> acción1 (); 
     } 

}; 

#terminara si
// ConcreteCommand2类
#ifndef _CONCRETECOMMAND2_HPP
 #define _CONCRETECOMMAND2_HPP 

# include " command.hpp " 

clase ConcreteCommand2: pública Mando {
 público : 
    ConcreteCommand2 (Receptor * REC) { 
        receptor = rec; 
    }; 
    virtual de  vacío Excute () anulación { 
        receptor -> acción2 (); 
    } 

}; 

#terminara si
// invocador类
#ifndef _INVOKER_HPP
 #define _INVOKER_HPP 

# include <lista> 
# include " command.hpp " 
el uso de  espacio de nombres std;
la clase de comando;
clase invocador {
 públicos :
     vacío addCmd (Comando * cmd) { 
        listCmd.push_back (cmd); 
    } 
    Void delCmd (Comando * CMD) { 
        listCmd.remove_if ([ =] (Comando * tmp) { retorno tmp == cmd;}); 
    } 
    Void Notify () {
         a (automático i: listCmd) {
            i-> Excute (); 
        } 
    } 
Privada : 
    lista <Comando *> listCmd; 
}; 

#terminara si
// 客户端程序 
#include <iostream> 
#include " concretecommand1.hpp " 
# include " concretecommand2.hpp " 
# include " receiver.hpp " 
# include " invoker.hpp " 

el uso de  espacio de nombres std;
int main () { 
    Receptor * receptor = nuevo receptor (); 
    ConcreteCommand1 * cmd1 = nuevo ConcreteCommand1 (receptor); 
    ConcreteCommand2 * cmd2 = nuevo ConcreteCommand2 (receptor); 
    Invocador * = invocadornuevo Invoker (); 
    invocador -> addCmd (cmd1); 
    invocador -> addCmd (cmd1); 
    invocador -> addCmd (cmd2); 
    invocador -> notificar (); 
    cout << " --------------- " << endl; 
    invocador -> delCmd (cmd1); 
    invocador -> notificar (); 
    getchar (); 
    volver  0 ; 
}

 

Supongo que te gusta

Origin www.cnblogs.com/yb-blogs/p/12616573.html
Recomendado
Clasificación