Autumn SALE
Commande

Commande en Ruby

La Commande est un patron de conception comportemental qui convertit des demandes ou des traitements simples en objets.

Cette conversion permet de différer ou d’exécuter à distance des commandes, de gérer un historique de commandes, etc.

Complexité :

Popularité :

Exemples d’utilisation : La commande est très répandue en Ruby. Elle est souvent utilisée comme une alternative aux callbacks pour paramétrer les éléments d’une UI avec des actions. Elle est également utilisée pour mettre des tâches dans une file d’attente, suivre un historique de traitements, etc.

Identification : La commande peut être reconnue grâce à ses méthodes comportementales à l’intérieur d’un type abstrait ou d’une interface (demandeur). Elles appellent une méthode dans une implémentation d’un type abstrait différent ou d’une interface différente (récepteur) qui a été encapsulée par l’implémentation de la commande lors de sa création. Les classes Commande se limitent généralement à lancer des actions spécifiques.

Exemple conceptuel

Dans cet exemple, nous allons voir la structure du patron de conception Commande. Nous allons répondre aux questions suivantes :

  • Que contiennent les classes ?
  • Quels rôles jouent-elles ?
  • Comment les éléments du patron sont-ils reliés ?

main.rb: Exemple conceptuel

# The Command interface declares a method for executing a command. class Command # @abstract def execute raise NotImplementedError, "#{self.class} has not implemented method '#{__method__}'" end end # Some commands can implement simple operations on their own. class SimpleCommand < Command # @param [String] payload def initialize(payload) @payload = payload end def execute puts "SimpleCommand: See, I can do simple things like printing (#{@payload})" end end # However, some commands can delegate more complex operations to other objects, # called "receivers". class ComplexCommand < Command # Complex commands can accept one or several receiver objects along with any # context data via the constructor. def initialize(receiver, a, b) @receiver = receiver @a = a @b = b end # Commands can delegate to any methods of a receiver. def execute print 'ComplexCommand: Complex stuff should be done by a receiver object' @receiver.do_something(@a) @receiver.do_something_else(@b) end end # The Receiver classes contain some important business logic. They know how to # perform all kinds of operations, associated with carrying out a request. In # fact, any class may serve as a Receiver. class Receiver # @param [String] a def do_something(a) print "\nReceiver: Working on (#{a}.)" end # @param [String] b def do_something_else(b) print "\nReceiver: Also working on (#{b}.)" end end # The Invoker is associated with one or several commands. It sends a request to # the command. class Invoker # Initialize commands. # @param [Command] command def on_start=(command) @on_start = command end # @param [Command] command def on_finish=(command) @on_finish = command end # The Invoker does not depend on concrete command or receiver classes. The # Invoker passes a request to a receiver indirectly, by executing a command. def do_something_important puts 'Invoker: Does anybody want something done before I begin?' @on_start.execute if @on_start.is_a? Command puts 'Invoker: ...doing something really important...' puts 'Invoker: Does anybody want something done after I finish?' @on_finish.execute if @on_finish.is_a? Command end end # The client code can parameterize an invoker with any commands. invoker = Invoker.new invoker.on_start = SimpleCommand.new('Say Hi!') receiver = Receiver.new invoker.on_finish = ComplexCommand.new(receiver, 'Send email', 'Save report') invoker.do_something_important 

output.txt: Résultat de l’exécution

Invoker: Does anybody want something done before I begin? SimpleCommand: See, I can do simple things like printing (Say Hi!) Invoker: ...doing something really important... Invoker: Does anybody want something done after I finish? ComplexCommand: Complex stuff should be done by a receiver object Receiver: Working on (Send email.) Receiver: Also working on (Save report.) 

Commande dans les autres langues

Commande en C# Commande en C++ Commande en Go Commande en Java Commande en PHP Commande en Python Commande en Rust Commande en Swift Commande en TypeScript