注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

东东的博客

江南烟雨,同大家一起分享

 
 
 

日志

 
 

设计模式读书笔记之命令模式(Command Pattern)  

2010-07-13 20:05:43|  分类: 设计模式相关 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

命令模式:将请求封装成对象,从而可使用不同的请求对客户进行参数化,对请求进行排队,撤销等操作。

命令模式

特点:

Invoker:负责接收和执行命令,也可对命令排队,执行命令撤销等等;

Command:命令接口,声明了相关的操作;

ConcreteCommand:具体的命令, 持有一个Receiver,并通过调用Receiver的方法执行具体的操作;

Receiver:请求的最终执行者。

基础代码:


view plaincopy to clipboardprint?
//  
package designpattern.command;  
public interface Command {  
    public void execute();  
}  
//  
package designpattern.command;  
  
public class Invoker {  
    private Command command;  
    //当然更好的作法是维护一个命令队列  
    //这样就可以实现对命令进行排序,撤销命令等操作。  
    //List commands = new ArrayList();  
      
    public void setCommand(Command com){  
        this.command = com;  
    }  
    public void executeCommand(){  
        this.command.execute();  
    }  
}  
  
//  
package designpattern.command;  
  
public class ConcreteCommand1 implements Command {  
    private Receiver receiver;  
    public ConcreteCommand1(Receiver r){  
        this.receiver = r;  
    }  
    public void execute() {  
        System.out.println("This is concrete command 1, the request will be executed by recriver.");  
        receiver.action();  
    }  
}  
//  
package designpattern.command;  
  
public class ConcreteCommand2 implements Command {  
    private Receiver receiver;  
    public ConcreteCommand2(Receiver r){  
        this.receiver = r;  
    }  
    public void execute() {  
        System.out.println("This is concrete command 2, the request will be executed by recriver.");  
        receiver.action();  
    }  
}  
//  
package designpattern.command;  
  
public class Receiver {  
    private String name;  
    public Receiver(String name){  
        this.name = name;  
    }  
    public void action(){  
        System.out.println("I am recriver " + name + ", action executed.");  
    }  
}  
//客户端测试类  
package designpattern.command;  
  
public class Client {  
    public static void main(String[] args) {  
        Command c1 = new ConcreteCommand1(new Receiver("1"));  
        Command c2 = new ConcreteCommand2(new Receiver("2"));  
        Invoker invoker = new Invoker();  
        invoker.setCommand(c1);  
        invoker.executeCommand();  
        invoker.setCommand(c2);  
        invoker.executeCommand();  
    }  
}  

举例说明:去烧烤店吃烧烤, 如果客人直接和烧烤的伙计打交道, 则烧烤的伙计将直接面对各种各样的客户各种各样的需求,各种各样的口味, 而且有的客人会因为等不及而走掉,但是伙计却不知道......最后烧烤伙计手忙脚乱,就乱套了. 那么我们用命令模式来改进一下这个烧烤店: 增加一个服务员, 负责接待客户, 那么客人将向服务员点菜; 服务员手中拿着烧烤订单纸, 客人只要把自己想要的东西写上, 并注明口味, 这就是命令, 服务员需按客人点餐的顺序把订单放在烧烤伙计的窗台上, 如果有客人退单了, 那么她只需要把订单抽掉就行了; 烧烤伙计则只需要看订单安心做烧烤就行了.

命令模式

代码就不写了. 和上面如出一辙.

优点:

很容易构造一个命令队列;

增加命令的状态,实现命令的撤销和重做;

新的命令轻而易举可以加入其中;

记录相关的命令日志.


转自:http://blog.csdn.net/sunxing007/archive/2010/04/04/5450503.aspx

  评论这张
 
阅读(1637)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017