J'ai récemment utilisé le décorateur de motif dans un service web qui utilise les éléments suivants CommandProcessor interface:
public Command receive(Request request);
public Response execute(Command command);
public void respond(Response response);
Fondamentalement, la CommandProcessor reçoit une Demande et crée le bon de Commande, exécute la Commande et crée la Réponse appropriée, et envoie la Réponse. Quand j'ai voulu ajouter un calendrier et journal, j'ai créé un TimerDecorator qui a utilisé un existant CommandProcessor que sa composante. Le TimerDecorator implémente CommandProcessor interface, mais ajoute juste le timing, puis appelle sa cible, qui est le véritable CommandProcessor. Quelque chose comme ceci:
public class TimerDecorator implements CommandProcessor {
private CommandProcessor target;
private Timer timer;
public TimerDecorator(CommandProcessor processor) {
this.target = processor;
this.timer = new Timer();
}
public Command receive(Request request) {
this.timer.start();
return this.target.receive(request);
}
public Response execute(Command command) {
return this.target.execute(command);
}
public void respond(Response response) {
this.target.response(response);
this.timer.stop();
// log timer
}
}
Donc le vrai CommandProcessor est enveloppé à l'intérieur TimerDecorator, et je peux traiter TimerDecorator tout comme la cible CommandProcessor, mais maintenant timing logique a été ajouté.