所有者策略简介(OwnerPolicy)

来源:互联网 发布:java 面试 书籍 编辑:程序博客网 时间:2024/04/28 15:39

原帖: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 的关系,结果我用来越来越多,所以,感觉它还是有点用的,在此推荐给大家,希望能起到一个抛砖引玉的作用。关于模板,我们还有很多事情可以做。

原创粉丝点击