J'ai différentes commandes qui partagent toutes des données communes, donc j'ai extrait cela à un super classe Command
. Toutes les commandes concrètes fonctionnent sur un objet de Foo
lorsqu'elles implémentent la méthode execute
. L'appelant réel de la commande est un client TheClient
qui crée un nouvel objet de la commande requise et l'exécute directement.Mise en œuvre de modèle de commande ou d'adaptation
Je l'ai implémenté de telle sorte que le client et inovker est indépendant des détails d'implémentation dans les commandes, et plus important encore, indépendant de la classe Foo
.
je les questions suivantes:
1) Est-ce une mise en œuvre du schéma de commande, ou en quelque sorte l'adoption de celui-ci?
2) D'après ma compréhension du modèle de commande, dans cet exemple Foo
est le récepteur. Est-ce correct?
3) Contrairement au modèle de commande pure, j'ai fusionné l'invocateur et le client dans la même classe. Certaines personnes disent que cela est OK dans le modèle de commande, puisque les deux sont une construction théorique et dans une implémentation réelle, ils peuvent être dans la même classe. Est-ce correct?
public abstract class Command {
protected String a;
protected Foo foo;
public Command(String a) {
this.a = a;
this.foo = new Foo(a);
}
public abstract void execute();
}
public class StartCommand extends Command {
private String b;
public StartCommand(String a, String b) {
super(a);
this.b = b;
}
public void execute() {
this.foo.doSomething("start " + a + " with " + b);
}
}
// ... other commands ...
public class Foo {
protected String name;
public Foo(String name) {
this.name = name;
}
public void doSomething(String action) {
// does something...
}
}
public class TheClient {
public static void main(String[] args) {
Command command = new StartCommand("x", "y");
command.execute();
}
}
Pour une raison quelconque, je ne peux pas instancier '' Foo'' dans le client, donc je ne peux pas utiliser le modèle de commande _pure_, n'est-ce pas? – user3510462
@ user3510462 J'ai modifié le post. Pourquoi ne pouvez-vous pas instancier 'Foo' dans le client? Pouvez-vous instancier ailleurs, que le 'Command'? – ntohl
'' Foo'' provient d'une bibliothèque tierce et je ne veux aucune dépendance à ce sujet dans mon projet client. – user3510462