没有合适的资源?快使用搜索试试~ 我知道了~
ACE资料系列 - ACE中设计模式
需积分: 9 21 下载量 138 浏览量
2009-07-17
12:12:14
上传
评论
收藏 264KB DOC 举报
温馨提示
试读
54页
详细介绍ACE中使用的设计模式和使用帮助,集合了网上收集的多篇文章,成为Word版
资源推荐
资源详情
资源评论
首先介绍一下 Bridge(桥模式)在 ACE 框架中的运用:
通信软件常常要对各种类型的事件进行多路分离、并进通行相应的处理。为使各种事件驱动的处理活动统一起来、并得以自动化,
提供了叫做 的事件多路分离和事件处理器分派框架。同时,为了保证应用的可移植性,无论是在何种操作系统上,
也无论底层使用了何种事件多路分离机制, 所提供的接口都是一样的;并且,在有些平台上,还可以根据实际需要,在
运行时更换底层所使用的事件多路分离机制(比如在 上既可以使用 ,也可以使用
)。 模式正是 具有这样的灵活性和可移植性的关键所在。
值得特别注意的是 的私有成员 ,这个指针变量正是 中的“桥”实现的关键所在。 是具
有高度可移植性的跨平台通信软件开发框架,在各种平台上提供相同的开发接口,是其重要目标之一。
上面所描述的 接口及相关接口,在 支持的各种平台上都是相同的,但因为这些平台提供的多路分离机制各不相
同,所以在开发 时,必须为不同的平台提供不同的具体实现。要达到这一目的,一般的做法是为每种平台定义一个继承
自 类的子类,在子类中提供该平台专用的具体实现。 但正如 ! 在 "# 一书中所说,这样的继承把实现
与抽象永久性地绑定在一起,使得我们难以独立地修改、扩展和复用各种抽象和实现。正是基于这样的考虑, 的开发者在实现
时,采用了 模式。
下图以 $ 和 为例,说明了体现在 中的 模式:
我们可以对照 "# 一书中 模式的结构图来理解上面这幅图。
Abstraction(ACE_Reactor) 定义 抽象的接口,并维护有一个指针 ,指向 % 类
型的一个对象。许多操作都将通过该指针转发给具体的 % 对象。
RenedAbstraction(无) 在 中没有定义 &,但如果你想要对 接口进行扩展,就可
以定义自己的。
Implementor(Reactor_Impl) 定义 实现类的接口。
ConcreteImplementor(ACE_Select_Reactor 和 ACE_WFMO_Reactor) 实现 % 接口,并定义其具体
实现。除了这里提到的到的 $ 和 ,在 中还定义了 "'#(基于
“('()或 “('()的 实现)和 *#(支持基于线程池的事件分派)等其他类型的 。详情可查
阅 的参考文档:+,((-('-("./($-
因为 的实现采用了 模式,我们在使用 时拥有很大的灵活性。比如说,
在 平台上,系统提供的 同时只能在 01 个句柄上等待,而
在使用了 2 个句柄进行内部管理,所以如果你使用的是 ,实际上只能同时
等待 02 个句柄,对于大型应用来说,这往往是不够的(显然,这个问题并非是 "-$+ 的错,
而是 ! 的错)。如果你不需要使用 提供的一些特别的功能(比如等待同步事
件),你可以改用 $ 来进行事件多路分离:
$3
43
------
通过使用面向对象技术及 模式, 具备了以下特性:
5-统一的 多路分离和分派接口
2-自动进行事件处理器分派
6-支持透明的扩展
1-增加复用
7-增强类型安全性
0-改善可移植性
8-线程安全性
上面基本上是马维达原文中的内容,
9999999999999999999999999999999999999999999999999999999999999999999999999999
下面要说的是 Strategy 模式的应用-
在 中包含有两种不同的内存管理类。一组基于 类,它们使用了动态绑定及 $/ 模式来提供灵活性及可扩
展性。其局限是它们只能用于进行局部动态内存管理。下面是 类的部分定义:::
classACE_Alloctor
{
public:
ACE_Alloctor(void);
virtual~ACE_Alloctor(void);
virtualvoid*malloc(size_tnbytes)=0;
virtualvoid*calloc(size_tnbytes,charinitial_value='"0')=0;
virtualvoid*calloc(size_tn_elem,size_telem_size,charinitial_value='"0')=0;
virtualvoidfree(void*ptr)=0;
virtualintremove(void)=0;
}
下面是继承自 的三种 (注:+ 实际上继承自 ;。
除这里列出的 以外, 还提供了其他 。详情参见 相关文档)如下:
ACE_Static_Allocator:
这个 管理固定尺寸的内存。每次收到内存请求时,它都移动某个内部指针,并返回内存 +<大块。
它假定内存一经分配,就不会再被释放。
ACE_Cached_Allocator:
这个 预先分配一个内存池,其中含有一定数目的指定尺寸的 +<。这些 +< 被维护在内部的一个 =
上,并在收到内存请( )时返回。应用调用 =时,+< 返回内存的 =,而不是 $-
ACE_New_Allocator:
包装 :: 和 操作符的 ,它在内部使用 和 操作符来满足动态内存请求。
这三种 使用了一同的内存分配策略/,适用于不同的情况。比如在实时系统中,有可能必须使
用预先分配内存的 +,用以获取高性能和可预测性。因为这些 + 都继
承自 ,所以它们拥有相同的接口,可以在编译时或运行时相互替换---但同时,因为这样的能力
是通过虚函数获得的,它们也要付出相应的代价:额外的间接层次来的时间开销本人注:可参见候捷先生的《::
对象模型深度探索》一书。
好了,/ 模式应用到这里结束了。
99999999999999999999999999999999999999999999999999999999999999999999999999
下面接着说 模式。
在前面的 / 模式中我们说到了 的内存管理类。其实在 中还有另外一组基于 模板类的
内存管理类。这一组类使用了 ::模板和外部多态性来提供内存分配的灵活性。它们不仅能够管理局部动态内存,也
能够管理进程间的共享内存。因为它们与基于 的类不同,没有使用继承和动态绑定,所以性能更高。
它们只能在编译时,通过其将要使用的内存池配置,而不能在运行时配置。显示,尽管其类效率更高,却不如
灵活。
下面是 模板类及其父类的部分定义:
template<ACE_MEM_POOL_1,classACE_LOCK,classACE_CB>
classACE_Malloc_T
{
public:
void*malloc(size_tnbytes);
void*calloc(size_tnbytes,charinitial_value='"0');
void*calloc(size_tn_elem,size_telem_size,charinitial_value='0"');
};
template<ACE_MEM_POLL_1,classACE_LOCK>
classACE_Malloc:publicACE_Malloc_T<ACE_MEM_POLL_2,ACE_LOCK,ACE_Control_Block>
{
public:
ACE_Malloc(constACE_TCHAR*pool_name=0);
ACE_Malloc(constACE_TCHAR*pool_name,
constACE_TCHAR*lock_name,
constACE_MEM_POOL_OPTIONS*options=0);
};
如上所示, 需要两个模板参数,一个是内存池类,一个是加锁类。而 中有以下几种不同的内
存池。
1.ACE_MMAP_Memory_Pool
宏:ACE_MMAP_MEMORY_POOL
使用<mmap(2)>创建内存池。内存因而可在内存间共享,在每次更新时内存被更新到 backing store.
2.ACE_Lite_MMAP_Memory_Pool
宏:ACE_LITE_MMAP_MEMORY_POOL
使用<mmap(2)>创建内存池。与前一种内存池不同,它不会更新到到 backing store.可靠性较低。
3.ACE_Sbrk_Memory_Pool
宏:ACE_SBRK_MEMORY_POOL
使用<sbrk(2)>创建内存池。
4.ACE_Shared_Memory_Pool
宏:ACE_SHARED_MEMORY_POOL
使用 SYSTEMV<shmget(2)>调用创建内存池。内存可在进程间共享
剩余53页未读,继续阅读
资源评论
dubing11
- 粉丝: 2
- 资源: 62
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- python-leetcode面试题解之第157题用Read4读取N个字符-题解.zip
- python-leetcode面试题解之第156题上下翻转二叉树-题解.zip
- python-leetcode面试题解之第155题最小栈-题解.zip
- python-leetcode面试题解之第153题寻找旋转排序数组中的最小值-题解.zip
- python-leetcode面试题解之第152题乘积最大子数组-题解.zip
- python-leetcode面试题解之第151题反转字符串中的单词-题解.zip
- python-leetcode面试题解之第150题逆波兰表达式求值-题解.zip
- python-leetcode面试题解之第149题直线上最多的点数-题解.zip
- python-leetcode面试题解之第148题排序链表-题解.zip
- python-leetcode面试题解之第147题对链表进行插入排序-题解.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功