设计模式学习笔记(十四)—Command模式
一、 Command模式定义:
将一个请求封装为一个对象,从而使你不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
二、 模式解说
Commad模式是一种对象行为模式,它可以对发送者(sender)和接收者(receiver)完全解耦(decoupling)。("发送者" 是请求操作的对象,"接收者" 是接收请求并执行某操作的对象。有了 "解耦",发送者对接收者的接口一无所知。)这里,"请求"(request)这个术语指的是要被执行的命令。Command模式还让我们可以对 "何时" 以及 "如何" 完成请求进行改变。因此,Command模式为我们提供了灵活性和可扩展性。
三、 结构图
Command模式结构图如下:

四、 怎么使用?
1) 定义一个Command接口,接口中有一个统一的方法,这就是将请求/命令封装为对象。
2) 定义具体不同命令类ConcreteCommand实现Command接口。
3) 定义一个命令的调用角色Invoker。
4) 定义一个命令执行状态的接收者Receiver(非必须)。
五、 一个例子
class Document{ public void display(){ System.out.println("显示文档内容"); } public void undo(){ System.out.println("撤销文档内容"); } public void redo(){ System.out.println("重做文档内容"); }}interface DocumentCommand{ public void execute();}class DisplayCommand implements DocumentCommand{ private Document document; public DisplayCommand(Document doc){ document=doc; } public void execute() { document.display(); } }class UndoCommand implements DocumentCommand{ private Document document; public UndoCommand(Document doc){ document=doc; } public void execute() { document.undo(); } }class RedoCommand implements DocumentCommand{ private Document document; public RedoCommand(Document doc){ document=doc; } public void execute(){ document.redo(); }}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(){ _dcmd.execute(); } public void undo(){ _ucmd.execute(); } public void redo(){ _rcmd.execute(); }}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); invoker.display(); invoker.undo(); invoker.redo(); }}