Command命令模式 - smartwgd - JavaEye技术网站

来源:百度文库 编辑:神马文学网 时间:2024/04/27 03:00:24
Command命令模式
参考:http://www.jdon.com/designpatterns/command.htm
还在看大话设计模式,今天偶然翻到命令模式,所以写写~~下面的内容均和此书有关。
命令模式(Command),将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
优点:解耦了发送者和接受者之间联系。
缺点:1个类变成3个类,多了好多类。
主要集中到这个原型图
Invoker类 被客户端调用,可以接受命令请求,设计命令队列,决定是否相应该请求,记录或撤销或重做命令请求,记录日志等等.
Java代码
public class Invoker {
private Command command;
public void setOrder(Command command) {
this.command = command;
}
public void ExecuteCommand() {
command.ExecuteCommand();
}
}
public class Invoker {private Command command;public void setOrder(Command command) {this.command = command;}public void ExecuteCommand() {command.ExecuteCommand();}}
Command类,将一个请求封装成一个对象,将一个请求具体化,方便对请求记录。
Java代码
public abstract class Command {
protected Receiver receiver;
public Command(Receiver receiver){
this.receiver = receiver;
}
public abstract void ExecuteCommand();
}
public abstract class Command {protected Receiver receiver;public Command(Receiver receiver){this.receiver = receiver;}public abstract void ExecuteCommand();}
ConcreteCommand类,可以将Receiver对象放到这个类里面,这个类具体实现了要怎么处理这个用户的请求。
Java代码
public class ConcreteCommand extends Command {
public ConcreteCommand(Receiver receiver){
super(receiver);
}
@Override
public void ExecuteCommand() {
receiver.Execute();
}
}
public class ConcreteCommand extends Command {public ConcreteCommand(Receiver receiver){super(receiver);}@Overridepublic void ExecuteCommand() {receiver.Execute();}}
Receiver类,其实这个类可以没有,不过为了让设计看起来更整洁清楚。
Java代码
public class Receiver {
public void Execute(){
System.out.println("Receiver excute!");
}
}
public class Receiver {public void Execute(){System.out.println("Receiver excute!");}}
最后一个Client类。
Java代码
public class Client {
public static void main(String[] args) {
Receiver r = new Receiver();
Command c = new ConcreteCommand(r);
Invoker i = new Invoker();
i.setOrder(c);
i.ExecuteCommand();
}
}
public class Client {public static void main(String[] args) {Receiver r = new Receiver();Command c = new ConcreteCommand(r);Invoker i = new Invoker();i.setOrder(c);i.ExecuteCommand();}}
最后一个书上面的示例