zoukankan      html  css  js  c++  java
  • 行为模式之命令

    命令模式(Command)是一种对象行为模式,它是把一个请求封装到一个对象中,使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。命令模式是对命令的封装,它把发出命令的责任与执行命令的责任分开,分别委派给不同的对象。如下图是命令模式的结构图:

    这里的参与者都有:

    Command
    — 声明执行操作的接口。
    ConcreteCommand 
    — 将一个接收者对象绑定于一个动作。
    — 调用接收者相应的操作,以实现 Execute
    •Client
    — 创建一个具体命令对象并设定它的接收者。
    Invoker
    — 要求该命令执行这个请求。
    •Receiver
    — 知道如何实施与执行一个请求相关的操作。任何类都可能作为一个接收者。

    由结构图给出对应的类设计,代码如下:

     1 class Invoker{//要求命令执行请求
     2     private Command command;
     3     public Invoker(Command c){
     4         command=c;
     5     }
     6     public void action(){
     7         System.out.println("execute command action");
     8         command.execute();
     9     }
    10 }
    11 class Receiver{//实施执行与请求相关的操作
    12     public void action(){
    13         System.out.println("this is Receiver's action,I will complete service");
    14     }
    15 }
    16 interface Command{
    17     void execute();
    18 }
    19 class ConcreteCommand implements Command{//将一个接收者对象绑定一个动作,并调用接收者相应的操作,以实现execute
    20     private Receiver rec;
    21     public ConcreteCommand(Receiver rec){
    22         this.rec=rec;
    23     }
    24     public void execute(){
    25         System.out.println("Call Receiver's action");
    26         rec.action();
    27     }
    28 }    
    29 public class Test{
    30     public static void main(String[] args) {
    31         Receiver rec=new Receiver();
    32         Command com=new ConcreteCommand(rec);
    33         Invoker inv=new Invoker(com);
    34         inv.action();
    35     }
    36 }
    View Code

    这里,我们定义好命令的接收者对象Receiver,然后将其传递给命令对象com,最后由inv要求该命令执行这个请求。从这里可以看出,命令模式将发出命令与执行命令这两个动作分开了,Command发出命令,但催动该命令的执行是Invoker完成的。所以,如果有排队需求的话,可以在Invoker这里设置相关功能。

  • 相关阅读:
    解题:POI 2009 TAB
    解题:POI 2015 Pieczęć
    解题:POI 2013 Taxis
    解题:POI 2015 Kinoman
    题目1012:畅通工程(并查集)
    并查集深入分析
    题目1186:打印日期(日期计算)
    C/C++如何整行读入字符串?
    四种方法解决最大连续子序列和问题
    题目1011:最大连续子序列
  • 原文地址:https://www.cnblogs.com/codeMedita/p/7374251.html
Copyright © 2011-2022 走看看