您的位置:首页 > 其它

所有者策略简介(OwnerPolicy)

2011-04-19 10:30 471 查看
原帖: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 的关系,结果我用来越来越多,所以,感觉它还是有点用的,在此推荐给大家,希望能起到一个抛砖引玉的作用。关于模板,我们还有很多事情可以做。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: