源自
Command模式
一 Command模式定义:
将一个请求封装为一个对象从而使你不同的请求对客户进行参数化对请求排队或记录请求日志以及支持可撤销的操作
二 模式解说
Commad模式是一种对象行为模式它可以对发送者(sender)和接收者(receiver)完全解耦(decoupling)(发送者 是请求操作的对象接收者 是接收请求并执行某操作的对象有了 解耦发送者对接收者的接口一无所知)这里请求(request)这个术语指的是要被执行的命令Command模式还让我们可以对 何时 以及 如何 完成请求进行改变因此Command模式为我们提供了灵活性和可扩展性
三怎么使用?
) 定义一个Command接口接口中有一个统一的方法这就是将请求/命令封装为对象
) 定义具体不同命令类ConcreteCommand实现Command接口
) 定义一个命令的调用角色Invoker
) 定义一个命令执行状态的接收者Receiver(非必须)
例子
view plaincopy to clipboardprint?
public class Document {
public void display() {
Systemoutprintln(显示文档内容);
}
public void undo() {
Systemoutprintln(撤销文档内容);
}
public void redo() {
Systemoutprintln(重做文档内容);
}
}
public interface DocumentCommand {
public void execute();
}
public class DisplayCommand implements DocumentCommand {
private Document document;
public DisplayCommand(Document doc) {
document = doc;
}
public void execute() {
documentdisplay();
}
}
public class RedoCommand implements DocumentCommand {
private Document document;
public RedoCommand(Document doc) {
document = doc;
}
public void execute() {
documentredo();
}
}
public class UndoCommand implements DocumentCommand {
private Document document;
public UndoCommand(Document doc) {
document = doc;
}
public void execute() {
documentundo();
}
}
public class DocumentInvoker {
private DisplayCommand _dcmd;
private UndoCommand _ucmd;
private RedoCommand _rcmd;
public DocumentInvoker(DisplayCommand dcmd UndoCommand ucmd
RedoCommand rcmd) {
this_dcmd = dcmd;
this_ucmd = ucmd;
this_rcmd = rcmd;
}
public void display() {
_dcmdexecute();
}
public void undo() {
_ucmdexecute();
}
public void redo() {
_rcmdexecute();
}
}
public class CommandTest {
public static void main(String[] args) {
Document doc = new Document();
DisplayCommand display = new DisplayCommand(doc);
UndoCommand undo = new UndoCommand(doc);
RedoCommand redo = new RedoCommand(doc);
DocumentInvoker invoker = new DocumentInvoker(display undo redo);
invokerdisplay();
invokerundo();
invokerredo();
}
}