所有者策略简介(OwnerPolicy)

    技术2022-05-19  19

    原帖:http://blog.csdn.net/RobertBaker/archive/2008/07/29/2727646.aspx

     

    // -------------------------------------------------------------- //  // Copyright (C) 2008 - All Rights Reserved //  // Author:  LiuYin // File:  OwnerPolicy // Version:  1.0 // Date:   2008-4-2 //  // Purpose:  //  // --------------------------------------------------------------

    #ifndef OwnerPolicy_H #define OwnerPolicy_H

    //

    template <class Owner> class OwnerPolicy { public:  OwnerPolicy()   : owner_(0)  {  }

     inline Owner * owner() const  { return owner_; }  inline void owner(Owner *_owner) { owner_ = _owner; }

    private:  Owner *owner_; };

    //

    #endif

    以上为 OwnerPolicy.h 文件,你不要看它很少哦,它可以容易地建立两个类的所有(拥有)关系,下面简单介绍一下,

    对象模型是这样的,ACE_Service_Postman 是鄙人使用ACE写的一个等同于 CSocket 的类,在逻辑上它可能是某个类(如下类CServiceAccessPoint)的成员变量,一些网络事件是需要它通知它的所有者 CServiceAccessPoint 的,这可怎么办,如果要通知CServiceAccessPoint,必然在 .h 文件中要出现 CServiceAccessPoint *,这样两个类的关系就不好处理了(下次用ACE_Service_Postman是不是要从 .h 文件里删除 CServiceAccessPoint* 换成新的 XX 类,这样不利于ACE_Service_Postman的重用),于是,我便想到了OwnerPolicy,用它的目的,仅仅是为了给 ACE_Service_Postman增加一个CServiceAccessPoint的指针,

    但是没想到,它大大弱化了这两个类的联系,使得从 ACE_Service_Postman 派生下来的 ACE_Server_Postman 成为一个可以独立的"静态组件" (我胡乱造的词,有的书是别的词,同一个意思),"静态组件"?? 什么意思,"静态组件"中的"组件"意谓着它和 COM这类组件 一样,对外提供一类功能,看下面的代码,对于 ACE_Server_Postman 来说,它的所有者要提供形为 on_active_handler(ACE_Server_Postman *) 的公有方法,(私有也可以,如果是 friend.),ACE_Server_Postman 并不关心所有者中 on_active_handler 的返回值,说明白了,就是 ACE_Server_Postman 的所有者提供了 on_active_handler, on_recv, on_disconnect 这几个 function, ACE_Server_Postman 同意为其所有者服务(有什么事ACE_Server_Postman就通知你),为什么还有"静态"呢,"静"是相对于"动"而言的,COM 是以 dll 提供的,而"静态组件"则是以代码方式提供的。它是利用模板来消除两个类之间的耦合的(记住哦,模板是消除类间耦合的一个有效途径,这种思想很厉害的,如 果你够灵活的话)。

    template <class Owner> class ACE_Server_Postman : public ACE_Service_Postman,                                                  public OwnerPolicy<Owner> { public:  int open(ACE_HANDLE handle, ACE_Proactor *proactor)  {   int ret = ACE_Service_Postman::open(handle, proactor);   owner()->on_active_handler(this);                        //    通知所有者我可以工作了

      return ret;  } protected:  void handle_recv(ACE_Message_Block &message_block)  {   ACE_TRACE("handle_recv(const ACE_Message_Block &)");

      owner()->on_recv(message_block);                    //    通知所有者我收到消息  }  void on_disconnect()  {   ACE_DEBUG((LM_DEBUG, "/non_disconnect()/n"));

      if (owner()) {    owner()->on_disconnect(this);                        //    通知所有者对端断开了网络连接   }

      delete this;  }

    private: };

    也就是说 CServiceAccessPoint 要提供这些东西,

    class CServiceAccessPoint {

    public:  typedef ACE_Server_Postman<CServiceAccessPoint> Handler;   public:  void on_recv(ACE_Message_Block &message_block)  {   //...  }  void on_active_handler(Handler *handler)  {   //...  }  void on_disconnect(Handler *handler)  {    //...   }

    private:  Handler *handler_; };

    后来,我发现这家伙(OwnerPolicy)太灵活了,可以很随意的让两个类产生 Owner 的关系,结果我用来越来越多,所以,感觉它还是有点用的,在此推荐给大家,希望能起到一个抛砖引玉的作用。关于模板,我们还有很多事情可以做。


    最新回复(0)