所有者策略简介(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 的关系,结果我用来越来越多,所以,感觉它还是有点用的,在此推荐给大家,希望能起到一个抛砖引玉的作用。关于模板,我们还有很多事情可以做。
- 所有者策略简介(OwnerPolicy)
- 我的组件之OwnerPolicy
- 策略模式简介
- 策略模式(Strategy)简介
- Html5 缓存策略简介
- 策略模式简介
- CTA策略简介
- 套利策略简介
- 事件驱动策略简介
- 维克多交易策略简介
- Domino 6 中的策略简介
- JAVA策略文件简介(上)
- JAVA策略文件简介(中)
- JAVA策略文件简介(下)
- Hive 简介及优化策略
- 策略路由(PBR)简介
- SQL 所有者
- 总结贴 策略讲堂的重点策略简介,优缺点分析
- CentOS下添加程序到服务并且设置服务自动启动的方法
- [原创]一步步教你用brew写游戏 2 -工欲善其事必先利其器
- Python 入门(3)-- IDLE的使用细节
- 动态弹出DIV层
- CDialog中不响应OnKeyDown和一些相关问题
- 所有者策略简介(OwnerPolicy)
- android Broadcast学习
- could not instantiate id generator
- 一个模板元在编译时候检查版本结构的功能
- 三星校园杯Android应用开发大赛正式启动
- 深入浅出大端小端
- inux中socketaddr_in的结构解析
- 冰雪两重天
- 在.net中接收邮件