在命令模式中,请求者(Invoker)不直接与接收者(Receiver)交互,即请求者(Invoker)不包含接收者(Receiver)的引用,因此彻底消除了彼此之间的耦合。
Command:
定义命令的接口,声明执行的方法。
ConcreteCommand:
命令接口实现对象,是“虚”的实现;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。
Receiver:
接收者,真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。
Invoker:
要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这个是客户端真正触发命令并要求命令执行相应操作的地方,也就是说相当于使用命令对象的入口。
命令模式的特点是
public class Client {
public void assemble(){
//创建接收者
Receiver receiver = new Receiver();
//创建命令对象,设定它的接收者
Command command = new ConcreteCommand(receiver);
//创建Invoker,把命令对象设置进去
Invoker invoker = new Invoker();
invoker.setCommand(command);
}
}
调用者 Invoker 直接调用command。但是 command里面的实现 是通过 Receiver 实现的。
问题是这一步的意义何在? invoker直接通过command接口调用命令 ,ConcreteCommand里面 把Receiver 去掉 。直接实现具体的业务。不就可以了。假如100个命令 。这样只要有100个command的类就可以了。而且也很方便增加命令 。如果用上面所说的,请求者和接收者解耦的话,那么还需要100个Receiver类。而且个人觉得 Receiver类没任何实际意义。
而且structs 的 servlet如果是用命令模式的话 。 servlet相当于 invoker。 action相当于command。 那么 structs也是通过invoker直接 调用 command。也没有通过Receiver 。
请高人解释一下
------解决方案--------------------
很同意楼主说的,你这次说的就是我说的意思。具体命令的实现是很灵活的,关键是调用者和业务执行者的解耦。