Il modello di comando è per incapsulare i comandi negli oggetti. Ma perché non usare invece i puntatori di funzione. Perché devo sottoclasse la classe Command per ogni operazione? Invece posso avere diverse funzioni e chiamare quelle funzioni per memorizzare i puntatori e così via ...Motivo di comando: perché incapsulato in un oggetto
risposta
Ma perché non utilizzare invece i puntatori di funzione.
Perché i puntatori di funzione non possono memorizzare lo stato arbitrario. Spesso vorrete che il comando sia parametrizzato quando lo create. Per esempio:
struct command {
virtual ~command() {}
virtual void do_it() = 0;
};
struct say_something : command {
// store a message to print later
say_something(std::string message) : message(message) {}
// print the stored message
void do_it() override {std::cout << message << '\n';}
std::string message;
};
std::unique_ptr<command> say_hello(new say_something("Hello!"));
// later
say_hello->do_it(); // prints stored string
Se si sceglie di usare un puntatore a funzione semplice, allora avresti bisogno di una funzione diversa per tutto ciò che si potrebbe desiderare di stampare.
Perché ho bisogno di sottoclasse classe di comando per ogni operazione?
Perché è così che funziona l'OOP vecchia scuola; anche se, come accennato in precedenza, è possibile utilizzare il fatto che si tratta di un oggetto per parametrizzarlo invece di suddividerlo in sottoclasse.
Fortunatamente, moderno C++ ha strutture migliori:
typedef std::function<void()> command;
// print a static string
command say_hello = []{std::cout << "Hello!\n";};
// store a string to print later
std::string goodbye = "Goodbye!";
command say_goodbye = [goodbye]{std::cout << goodbye << '\n';};
// later
say_hello(); // prints static string
say_goodbye(); // prints string stored in the command
modello di comando è molto più di una semplice esecuzione di una funzione. Incapsula dati e logica all'interno di una classe e fornisce un oggetto che può essere facilmente passato come parametro. Oltre ad eseguire attività, potrebbe anche generare eventi, analizzare e pulire i dati e molto altro, ed è qui che i metodi di ereditarietà e di template sono utili, che non si otterranno con i puntatori di funzione. Inoltre, implementare undo e redo è molto semplice usando i comandi.
+1 per ereditarietà, annulla e ripristina (più funzioni correlate al comando) e incapsula i dati (ad esempio lo stato) – Narek
- 1. Scala avanti o delegare metodi a oggetto incapsulato
- 2. Perché TabActivity è deprecato (motivo)?
- 3. Android Wear: c'è qualche motivo per usare un oggetto Time piuttosto che un oggetto Calendar?
- 4. Perché questo comando in ggplot restituisce un errore?
- 5. Perché questo comando causa un overflow dello stack in prolog?
- 6. Motivo di progettazione MapMaker?
- 7. Motivo di oggetti null generici in C#
- 8. comando RCP con l'argomento oggetto
- 9. Perché molte proprietà in WPF sono un "oggetto" anziché un'interfaccia?
- 10. Motivo di progettazione "Facciata"
- 11. parametro di comando wpf da altro oggetto
- 12. Perché non posso convertire un oggetto (che è veramente oggetto []) in stringa []?
- 13. Motivo decorativo in C++
- 14. Come capire il motivo di un SIGSEGV in Android
- 15. Ridimensionamento di un motivo di riempimento in raphael.js
- 16. Rimozione di un determinato motivo di stringa in R
- 17. Riconoscimento di un motivo utilizzando OpenCV
- 18. Perché "local" scopa il codice di ritorno di un comando?
- 19. Perché non esiste un oggetto StrongReference?
- 20. Il motivo dell'esistenza di JVM
- 21. Quando e perché vorresti trasmettere un oggetto?
- 22. Perché play.libs.Json.toJson restituisce un oggetto vuoto?
- 23. Perché le persone definiscono classe, tratto, oggetto all'interno di un altro oggetto in Scala?
- 24. perché richiedono ("angolare") restituisce un oggetto vuoto
- 25. C'è davvero un motivo di scoppio sull'unità?
- 26. Per quale motivo dovrei prendere in giro?
- 27. Perché ISerializationSurrogate.SetObject restituisce un oggetto e accetta la compilazione di un oggetto?
- 28. Perché "oggetto .__ dict__ è oggetto .__ dict__" Falso?
- 29. Crea comando iSeries che accetta un nome oggetto come parametro
- 30. Perché Guid NON è un oggetto in C#?
Citazione "Se si dovesse utilizzare un puntatore a funzione semplice, sarà necessaria una funzione diversa per tutto ciò che si desidera stampare." Ma tu non devi. Puoi chiamare la funzione con diversi parametri, mentre crei un comando con argomenti diversi. – Narek
@Narek ma il pattern Command non ti consente di fornire argomenti quando invochi il comando, solo quando lo crei. Quindi hai bisogno di un oggetto per archiviarli in modo che siano disponibili quando è invocato. –