当一个函数对象被当做回调时候,就是一个command模式的实例

什么是回调? 回调就是框架知道什么时候干一些事情,但是具体干什么,或许框架一无所知(因为回调函数不是他设计的),而用户则知道发生一个特定事件的时候,应该干什么,但是他不知道什么时候去干这个事情。这两个部分共同构成了一个完整的应用程序。

常见的回调函数的实现方式是函数指针,类似如下的方式:

extern void playmusic();

//。。。

button * new Button(“anko no nama”);

b->setAction( playmusic);

registerButtonWithFramework(b);

但是现实中我们可能有这样的需求,设计播放的歌曲,他所使用的编码,和解码器等等, 一个比较好的方式是利用函数对象代替函数指针。

使用这个方式有一个显而易见的好处,函数对象可以封装数据,同时函数对象可以虚拟成员表现出动态行为。

   1:  class Action
   2:  {
   3:  public:
   4:      virtual ~Action();
   5:      virtual void operation()()=0;
   6:      virtual Action *clone() const = 0; //原型(prototype);
   7:  }
   8:   
   9:  class Button
  10:   
  11:  {
  12:   
  13:  public:
  14:      Button(const std::string &label ): label_( label),action_(0){}
  15:      void setAction(const Action *newAction)
  16:      {
  17:          Action *temp = newAction.clone();
  18:          delete action_;
  19:          action_ = temp;
  20:      }
  21:   
  22:      void onClick() const
  23:      {
  24:          if( action_ ) (*action)();
  25:      }
  26:  private:
  27:      std::string label_;
  28:      Action *action;
  29:  }
  30:   
  31:  class PlayMusic : public Action
  32:  {
  33:  public:
  34:      PlayMusic( const string &songFile ):song_(songFile){}
  35:      void operator ()();
  36:      Action *clone();
  37:  private:
  38:      MP3 song_;
  39:  }
  40:   

被封装的数据既保持了playmusic的函数对象的灵活性,有保持了他的安全性;

   1:  Button *b = new Button( “anoko no nama” );
   2:  auto_ptr<PlayMusic> song( ne PlayMusic(“anokononama.mp3”));
   3:  b->setAction( song.get)

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

可以看做是函数对象的又一个比较好的应用;

条款19 command 模式与好莱坞法则的更多相关文章

  1. Java设计模式(22)命令模式(Command模式)

    Command模式是最让我疑惑的一个模式,我在阅读了很多代码后,才感觉隐约掌握其大概原理,我认为理解设计模式最主要是掌握起原理构造,这样才对自己实际编程有指导作用.Command模式实际上不是个很具体 ...

  2. C++基础——模拟事务 (1)COMMAND模式

    =================================版权声明================================= 版权声明:原创文章 禁止转载  请通过右侧公告中的“联系邮 ...

  3. Command模式

    Command模式只是封装了一个没有任何变量的函数. interface Command{ void Excute();} 具有强烈的分解功能的味道.把函数层面的任务提升到了类的层面(一个类仅仅是为了 ...

  4. 敏捷软件开发(3)---COMMAND 模式 & Active Object 模式

    COMMAND 模式 command模式非常简单,简单到你无法想象的地方. public interface Command { void execute(); } 这就是一个command模式的样子 ...

  5. 开发设计模式(一)Command模式

    Command定义 将来自客户端的请求传入一个对象,无需了解这个请求激活的 动作或有关接受这个请求的处理细节. 这是一种两台机器之间通讯联系性质的模式,类似传统过程语 言的 CallBack功能. 优 ...

  6. Command 模式

    Command 模式通过将请求封装到一个对象(Command)中,并将请求的接受者存放具体的 ConcreteCommand 类中(Receiver)中,从而实现调用操作的对象和操作的具体实现 者之间 ...

  7. 【行为型】Command模式

    命令模式是指将用户的请求封装成(命令)对象,从而可将用户不同的请求进行参数化.对这些请求排序或记录请求日志.以及支持回滚恢复操作.记得以前刚开始使用Photoshop时,就发现它的操作历史记录面板特别 ...

  8. [译]使用Command模式和MediatR简化你的控制器

    原文 你希望保持你的controller足够简单. 你的controller越来越臃肿,你听说command模式是一个给controller瘦身的解决方案. 但是你不知道command模式是否适合你的 ...

  9. Xwork概况 XWork是一个标准的Command模式实现,并且完全从web层脱离出来。Xwork提供了很多核心功能:前端拦截机(interceptor),运行时表单属性验证,类型转换,强大的表达式语言(OGNL – the Object Graph NavigationLanguage),IoC(Inversion of Control反转控制)容器等。 ----------------

    Xwork概况 XWork是一个标准的Command模式实现,并且完全从web层脱离出来.Xwork提供了很多核心功能:前端拦截机(interceptor),运行时表单属性验证,类型转换,强大的表达式 ...

随机推荐

  1. php新浪微博登录接口用法实例

    本文实例讲述了php新浪微博登录接口用法.分享给大家供大家参考.具体分析如下: 在做微博登陆之前是需要申请到APP KEY 和App Secret,这个的申请方式请去 open.weibo.com 申 ...

  2. gerrit 配置 apache2 反向代理(转载)

    Apache 2 Configuration To run Gerrit behind an Apache server using mod_proxy, enable the necessary A ...

  3. Struts中<s:checkboxlist>的用法

    一.JSP中 ①集合为list <s:checkboxlist name="list" list="{'Java','.Net','RoR','PHP'}" ...

  4. ubuntu 16.04 64bit安装 Julia

    sudo add-apt-repository ppa:staticfloat/juliareleases sudo add-apt-repository ppa:staticfloat/julia- ...

  5. dedecms v5.7 sp1 给栏目添加缩略图功能

    一.给数据库添加字段typeimg 如图:   二 . 修改 dede/catalog_add.php 找到 $in_query = "INSERT INTO `#@__arctype`(r ...

  6. nginx 环境搭建(基于linux)

    Nginx是一种服务器软件,故而其最主要.最基本的功能当然是可以与服务器硬件结合,让程序员可以将程序放在Nginx服务器上,将程序发布出去,让成千上万的网民可以浏览.除此之外,Nginx是一种高性能的 ...

  7. (easy)LeetCode 257.Binary Tree Paths

    Given a binary tree, return all root-to-leaf paths. For example, given the following binary tree: 1 ...

  8. DML(Oralce)

    创建视图简化上面              视图就是一张表    一个子查询  虚表 视图通常以v$开头 grant create table,create view to scott;        ...

  9. DNS加速

    http://elingwange.iteye.com/blog/1563497 http://blog.csdn.net/lize1988/article/details/10404645 java ...

  10. C语言-删除重复字符

    //实现对一个字符串的删除重复的字符,并输出删除后的字符串,(如从”testroadeasy”中输出”tesroady”) Action(){    char *str="testroade ...