/*命令模式:将一个请求封装为一个对象,从而是你可用不同的请求对客户进行参数化,对请求对象排队或者记录请求日志,
* 以及支持可撤销的操作.
* 注:
* 第一:他能容易的设计一个命令队列,
* 第二:在需要的请鲁昂下,可以容易的将命令记录日志.
* 第三:语序接受请求的一方决定是否否决请求.
* 第四:可以容易的实现对请求的撤销和重做.
* 第五由于新加进的类不影响其他的类,因为增加新的具体命令类很容易.
* 有一个优点:命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分割开.
* */
package com.zwy;
import java.util.ArrayList;
import java.util.List;
/*命令模式:将一个请求封装为一个对象,从而是你可用不同的请求对客户进行参数化,对请求对象排队或者记录请求日志,
* 以及支持可撤销的操作.
* 注:
* 第一:他能容易的设计一个命令队列,
* 第二:在需要的请鲁昂下,可以容易的将命令记录日志.
* 第三:语序接受请求的一方决定是否否决请求.
* 第四:可以容易的实现对请求的撤销和重做.
* 第五由于新加进的类不影响其他的类,因为增加新的具体命令类很容易.
* 有一个优点:命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分割开.
* */
public class CommandTest {
public static void main(String[] args) {
Invoker invoker = new Invoker();
Command cmd1 = new Command(new ConcreteReceriver());
invoker.add(cmd1);
Command cmd2 = new Command(new ConcreteReceriver());
invoker.add(cmd2);
invoker.run();
}
}
/*各种各样的命令*/
class Command {
protected Receiver receiver ;
public Command(Receiver receiver) {
this.receiver = receiver;
}
public void Operator() {
receiver.Operator();
}
}
/*命令执行的基类*/
abstract class Receiver {
public abstract void Operator() ;
}
/*命令执行的地方*/
class ConcreteReceriver extends Receiver{
@Override
public void Operator() {
System.out.println(this.getClass().getName() + "正在处理请求");
}
}
/*接受命令的地方,减少命令的地方,并且执行发布命令的执行的地方*/
class Invoker {
List<Command> cmds = new ArrayList<Command>();
public void add( Command cmd) {
cmds.add(cmd);
}
public void remove(Command cmd){
cmds.remove(cmd);
}
public void run() {
for(Command cmd :cmds){
cmd.Operator();
}
}
}