所有者策略简介(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 的关系,结果我用来越来越多,所以,感觉它还是有点用的,在此推荐给大家,希望能起到一个抛砖引玉的作用。关于模板,我们还有很多事情可以做。
// --------------------------------------------------------------
//
// 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 的关系,结果我用来越来越多,所以,感觉它还是有点用的,在此推荐给大家,希望能起到一个抛砖引玉的作用。关于模板,我们还有很多事情可以做。
相关文章推荐
- TSM简介(二) - 策略、介质与服务器管理
- TMG防火墙策略基本简介
- HTML5安全:内容安全策略(CSP)简介
- Spark调研笔记第3篇 - Spark集群对应用的调度策略简介
- 第五章 SNS的主要营销策略简介
- Hibernate中的主键生成策略简介
- IBM Lotus Sametime 8.5 策略管理简介
- MySQL 5.7 密码安全策略简介
- 网站优化:浏览器缓存控制简介及配置策略
- JAVA策略文件简介(上)
- 调度器简介,以及Linux的调度策略
- Linux防火墙简介 – iptables配置策略
- 维克多交易策略简介
- JAVA策略文件简介(中)
- Erlang & Go 的IO优化策略简介
- JAVA策略文件简介(下)
- Win2008 R2服务器入站规则和安全策略简介
- Storm的并行度、Grouping策略以及消息可靠处理机制简介
- 组策略管理02:GPMC简介
- (一)委托模式简介 委托模式是基本的设计模式之一。委托,即是让另一个对象帮你做事情。 许多其他的模式,如状态模式、策略模式、访问者模式本质上是在更特殊的场合采用了委托模式。 委托模式使得我们可以用聚合