Welcome

首页 / 软件开发 / 数据结构与算法 / 设计模式学习笔记(十四)—Command模式

设计模式学习笔记(十四)—Command模式2011-02-04 blogjava 蝸ゼ牜ご赽跑一、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();

}

}