woaidongmao
文章均收录自他人博客,但不喜标题前加-[转贴],因其丑陋,见谅!~
随笔 - 1469, 文章 - 0, 评论 - 661, 引用 - 0
数据加载中……
策略模式(policy)
一,策略模式
在看《C++设计新思维》的时候,发现在一开始就大篇幅的介绍策略模式(policy),策略模式不属于经典设计模式中的一种,但是其实在我们日常的开发中是必不可少的。policy,策略,方针,这里的意思是指把复杂功能的类尽量的拆分为功能单一的简单类的组合,简单的类只负责单纯行为或结构的某一方面。增加程序库的弹性,可复用性,可扩展性。policy是一个虚拟的概念,他定义了某一类class的一些接口规范,并不与C++语法的关键字对应,只是一个抽象的概念。
二 实例1
//
policy模式的常见使用实例smartptr,
template
<
class
T,
template
<
class
>
class
CheckingPolicy,
template
<
class
>
class
ThreadingModel
>
class
SmartPtr
:
public
CheckingPolicy
<
T
>
,
public
ThreadingModel
<
SmartPtr
>
{
T
*
operator
->
()
{
typename ThreadingModel
<
SmartPtr
>
::Lock guard(
*
this
);
CheckingPolicy
<
T
>
::Check(pointee_);
return
pointee_;
}
private
:
T
*
pointee_;
}
;
三 实例二,比如说:我们定义一个policy,他是一个带有参数T的一个模版,他必须有一个Create函数,且返回T类型指针。对于这个定义,我们可以有不同的实现,从而满足不同用户的不同的需求。
template
<
class
T
>
struct
OpNewCreator
{
static
T
*
Create()
{
return
new
T;
}
}
;
template
<
class
T
>
struct
MallocCreator
{
static
T
*
Create()
{
void
*
buf
=
std::malloc(
sizeof
(T));
if
(
!
buf)
return
0
;
return
new
(buf) T;
}
}
;
template
<
class
T
>
struct
PrototypeCreator
{
PrototypeCreator(T
*
pObj
=
0
)
:pPrototype_(pObj)
{}
T
*
Create()
{
return
pPrototype_
?
pPrototype_
->
Clone() :
0
;
}
T
*
GetPrototype()
{
return
pPrototype_; }
void
SetPrototype(T
*
pObj)
{ pPrototype_
=
pObj; }
private
:
T
*
pPrototype_;
}
;
//
test class
class
Widget
{
}
;
//
调用方法一:
template
<
class
CreationPolicy
>
class
WidgetManager :
public
CreationPolicy
{
}
;
void
main()
{
typedef WidgetManager
<
OpNewCreator
<
Widget
>
>
MyWidgetMgr;
}
//
调用方法二:因为一般Manager是特定于某一类的class,所以在Manager中就指定要处理的class类型。
template
<
template
<
class
Created
>
class
CreationPolicy
>
class
WidgetManager :
public
CreationPolicy
<
Widget
>
{
}
;
void
main()
{
//
Application code
typedef WidgetManager
<
OpNewCreator
>
MyWidgetMgr;
}
对于上面一个策略有3中不同的实现,从而就可以满足不同的客户的需求。
但是对于上面的使用,我们还可以有更好的修改:因为Policy的实现class一般会被继承,所以我们要考虑他的析构,一般的我们使析构函数virtual,但是这里会影响template的静态编译特性,影响效率,所以我们使用protected或private的析构函数,既不影响继承类对基类的析构,也不影响使用。
如修改如下:
template
<
class
T
>
struct
OpNewCreator
{
static
T
*
Create()
{
return
new
T;
}
protected
:
~
OpNewCreator()
{}
}
;
我们还可以修改上面的manger,实现creator policy的switch:
template
<
template
<
class
>
class
CreationPolicy
>
class
WidgetManager :
public
CreationPolicy
<
Widget
>
{
void
SwitchPrototype(Widget
*
pNewPrototype)
{
CreationPolicy
<
Widget
>&
myPolicy
=
*
this
;
delete myPolicy.GetPrototype();
myPolicy.SetPrototype(pNewPrototype);
}
}
;
四 policy 模式对我们创建可复用,可扩展的库的开发有非常重要的作用,是OO的基本的设原则式之一。
posted on 2008-09-14 18:00
肥仔
阅读(548)
评论(0)
编辑
收藏
引用
所属分类:
设计模式
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
敏捷思维:分层
策略模式(policy)
MVC模式和文档/视图结构
MVC的理解
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
Powered by:
C++博客
Copyright © 肥仔
导航
C++博客
首页
新随笔
联系
聚合
管理
<
2012年4月
>
日
一
二
三
四
五
六
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(10)
给我留言
查看公开留言
查看私人留言
随笔分类
Boost & STL (37)
(rss)
C++ 基础(181)
(rss)
C++ 模板(48)
(rss)
COM(12)
(rss)
Flash & Flex(3)
(rss)
HTTP & URL(24)
(rss)
IDC & 服务器DIY(4)
(rss)
LEX & YACC(41)
(rss)
Linux(1)
(rss)
MFC存档(30)
(rss)
OOP(8)
(rss)
UML(4)
(rss)
VC 存档(45)
(rss)
Web Rss(4)
(rss)
Web-后台(157)
(rss)
Web-前台(32)
(rss)
Win32 Bat(1)
(rss)
Windows开发(91)
(rss)
XML(5)
(rss)
编程思想(96)
(rss)
调试(17)
(rss)
工具(22)
(rss)
脚本语言(10)
(rss)
开车(46)
(rss)
库 & 代码段(16)
(rss)
模板引擎(8)
(rss)
其他经验(30)
(rss)
设计模式(4)
(rss)
设计图例(6)
(rss)
生活——常识(31)
(rss)
生活——导购(15)
(rss)
生活——健康(118)
(rss)
生活——运动(30)
(rss)
生活——自行车(2)
(rss)
数据结构 & 算法(2)
(rss)
数据库(97)
(rss)
网络编程(59)
(rss)
压缩 & 解压(9)
(rss)
正则表达式(6)
(rss)
转型——创业 & 立业(46)
(rss)
转型——经济 & 金融(8)
(rss)
转型——投资 & 理财
(rss)
状态机 & 自动机 & 形式语言(56)
(rss)
字符编码(16)
(rss)
随笔档案
2014年4月 (1)
2013年4月 (1)
2013年3月 (1)
2012年9月 (4)
2012年7月 (4)
2012年6月 (10)
2012年5月 (4)
2012年4月 (19)
2012年3月 (24)
2012年2月 (2)
2012年1月 (3)
2011年12月 (1)
2011年11月 (2)
2011年10月 (2)
2011年9月 (13)
2011年8月 (40)
2011年7月 (31)
2011年6月 (22)
2011年5月 (25)
2011年4月 (21)
2011年3月 (20)
2011年2月 (11)
2011年1月 (13)
2010年12月 (9)
2010年9月 (3)
2010年8月 (3)
2010年7月 (10)
2010年6月 (2)
2010年5月 (9)
2010年4月 (3)
2010年3月 (20)
2010年2月 (12)
2010年1月 (4)
2009年12月 (9)
2009年11月 (19)
2009年10月 (38)
2009年9月 (64)
2009年8月 (116)
2009年7月 (47)
2009年6月 (121)
2009年5月 (14)
2009年4月 (10)
2009年3月 (59)
2009年2月 (15)
2009年1月 (24)
2008年12月 (57)
2008年11月 (84)
2008年10月 (60)
2008年9月 (97)
2008年8月 (52)
2008年7月 (26)
2008年6月 (59)
2008年5月 (112)
2008年4月 (35)
2008年1月 (2)
搜索
最新评论
1. re: 利用VS2005进行dump文件调试
不错,工具是什么、怎么用清楚了,程序调试、查错非常有用
--黄华仔
2. re: COM 类工厂有必要存在吗?
评论内容较长,点击标题查看
--天空之城
3. re: 改动和维护一份代码的多个版本将使人心力憔悴[未登录]
123
--123
4. re: MySql数据库--mysql_real_escape_string()函数
ert
--wewe\'4545
5. re: 使用std::vector 的陷阱
评论内容较长,点击标题查看
-- klinik apotik24
6. re: 使用std::vector 的陷阱
评论内容较长,点击标题查看
--Dr.Aborsi Kandungan
7. re: 利用C++模板,代替虚函数,实现类的静态多态性(加入性能测试部分)[未登录]
求问怎么优化的
--hunter
8. re: 浅谈URL最后带斜杠对SEO优化的影响
不错
--第三方
9. re: 大文件内数据排序问题:采用文件映射内存技术
あなたの教授が望んでいた紙を提供することができるので、あなたが期限と提出の期日を心配する必要はありません
--best-custom-essays.com
10. re: 大文件内数据排序问题:采用文件映射内存技术
は!この記事では、はるかに良い書き込むことができませんると、私の以前のルームメイトのことをでした!
--Essays-shark.net
11. re: 有限状态机时代终结的10大理由
技术终会发展,但也用不着扯淡吧。
--ywx
12. re: traits:Traits技术初探
示例不能运行啊
--lzq
13. re: 使用std::vector 的陷阱
如果有引用记数的话,如智能指针, 就不会被释放掉了。不过如果一般编码里面不需要用到引用记数的话,还是方法1比较简便
--Obat Penggugur Kandungan
14. re: 使用std::vector 的陷阱
容器只有责任维护你给他的东西,但没理由维护这个东西里面的东西。不仅仅是vector,STL所有的容器如果按你这种思维去用
--Cara Menggugurkan Kandungan
15. re: C++中派生类对基类成员的三种访问规则
@lan
确实不可以,只有在派生类成员函数中(内部访问)才可以访问。
--walzzz
16. re: 使用std::vector 的陷阱
私のような初心者のための読書の多くを必要とし、様々なブログ上の情報を検索します。あなたはとても素敵を共有し、私を鼓舞し、記事
--cara menggugurkan kandungan
17. re: 分层有限状态机HFSM\行为树BEHAVIOR TREE和FSM
那个链接的帖子没了,可以给一个学习下吗,
2520079@qq.com
--屌丝策划一枚
18. re: 使用std::vector 的陷阱
この記事では、読者のために非常に良いと便利です。知識の共有をありがとうございました
--obat penggugur kandungan
19. re: 判断字符串是否UTF8编码
有问题,输入 GBK的 “蓝色” ,判断的结果是utf-8编码。
--ddd
20. re: visual studio 2008 试用版评估期已结束的解决方法
大谢,有的人没有这个框的。@lizongqi
--WU
21. re: 判断字符串是否UTF8编码
试一下输入gbk码的“联通”二字,发现判断的结果是utf-8编码,所以该判断函数存在问题
--liuyuananfang
22. re: 浅谈URL最后带斜杠对SEO优化的影响[未登录]
转载请说明,连个原文地址也没有,素质!
--无名
23. re: 模板导致的代码膨胀问题和解决
评论内容较长,点击标题查看
--myanbu
24. re: 利用C++模板,代替虚函数,实现类的静态多态性(加入性能测试部分)
评论内容较长,点击标题查看
--ngugc
25. re: visual studio 2008 试用版评估期已结束的解决方法
评论内容较长,点击标题查看
--费瓦湖
26. re: 使用std::vector 的陷阱
评论内容较长,点击标题查看
--judi bola
27. re: 词法分析器生成工具FLEX简介[未登录]
yywrap()函数果真一定要用户提供吗?我自己写的例子就没有提供,照样运行的好好的。
--路人甲
28. re: C函数中,可变长参数的传递?
大爱楼主
--花雨
29. re: MYSQL查询某一个字段为空或者不为空[未登录]
123123123
--123
30. re: 关于FlushViewOfFile的问题
感觉我的东西并没有写入磁盘为什么你
--jjj
31. re: malloc,new,VirtualAlloc,HeapAlloc性能(速度)比较
new 或 malloc调用heapalloc,heapalloc调用virtualalloc。底层速度更快。
如果你显示的结果慢,那是因为你使用方式不符合相对应的API特点而已。
--看到了
32. re: 利用GoAhead构建嵌入式web应用
收录却不附上链接地址,有点过了,学这行基本的版权意识都没有
--fsa
33. re: 大文件内数据排序问题:采用文件映射内存技术
评论内容较长,点击标题查看
--http://www.tvslakshmischool.org/
34. re: Dissect Eclipse Plugin Framework
评论内容较长,点击标题查看
--IT技术网站
35. re: PowerDesigner教程系列
评论内容较长,点击标题查看
--IT技术网站
36. re: 使用zlib压缩解压缩文件的详细过程
我只能参考前5行
--Fack
37. re: visual studio 2008 试用版评估期已结束的解决方法
真的很好用。补丁特别给力!方法也是对的。两个方法要结合到一起来用。
--Lueyhong Wu
38. re: 用汇编实现原子操作
评论内容较长,点击标题查看
--wd
39. re: 代码自动生成工具MyGeneration之一,二,三
这个不是原创的吧....
--原创者
40. re: 使用std::vector 的陷阱
但没理由维护这个东西里面的东西。所有的容器如果按你这种思维去用,则应该存储该数据
--agen bola terpercaya
阅读排行榜
1. google ProtoBuf开发者指南(72210)
2. 怎样在Word里面将字体背景颜色去掉?(56339)
3. 如何使用Office2003来打开Docx、xlsb、xlsx等文件(40938)
4. vc中调用Com组件的方法详解(39443)
5. visual studio 2008 试用版评估期已结束的解决方法(39116)
6. gSOAP中文文档(34395)
7. C函数中,可变长参数的传递?(31967)
8. Bison-Flex 笔记(24595)
9. 膝盖过劳损伤----详细分类图片(特优文章)(23538)
10. 使用zlib压缩解压缩文件的详细过程(22899)
11. 有限状态机时代终结的10大理由(20829)
12. 利用VS2005进行dump文件调试(20650)
13. 现在市面上的正红花油到底哪个是最老的牌子?(19116)
14. 衣服洗完以后还有一种臭汗味,如何处里?(19043)
15. PowerDesigner教程系列(18256)
16. 局域网通过ip查看对方计算机名,通过计算机名查看对方ip(18200)
17. 词法分析(NFA与DFA)(18013)
18. windows中添加PATH环境变量(17907)
19. zlib用法简单说明(17105)
20. 草木瓜----Lex和Yacc教程(16635)
21. MYSQL查询某一个字段为空或者不为空(15875)
22. malloc,new,VirtualAlloc,HeapAlloc性能(速度)比较(15804)
23. Java连接mysql数据库攻略(15766)
24. 用Visio画UML图 类结构图(基本篇)(14748)
25. 用Visio画UML图 基本操作(13692)
26. 使用Flex Bison 和LLVM编写自己的编译器(13327)
27. 膝盖解剖图(12386)
28. Word项目符号和编号对齐的问题(12359)
29. Keep-Alive: timeout=5, max=100(12197)
30. Zlib函数列表和使用手册(11654)
31. 用Visio画UML图 类结构图(进阶篇)(11290)
32. java enum无法赋初始值(11084)
33. MySql数据库--mysql_real_escape_string()函数(10940)
34. 字符串匹配算法(10857)
35. zlib使用defalte, gzip的例子(10377)
36. 如何在vc中更改栈空间的大小(10189)
37. 使用MiniDumpWriteDump API 来生成程序的Dump(10108)
38. HTTP/1.1协议规范(中文归纳版)(10066)
39. 词法分析器生成工具FLEX简介(10057)
40. 享誉盛名的12分钟跑以及相关成绩(9932)
评论排行榜
1. visual studio 2008 试用版评估期已结束的解决方法(58)
2. 使用std::vector 的陷阱(30)
3. 40 个轻量级 JavaScript 库(17)
4. SIZEOF宏,弥补sizeof不足(17)
5. 正则表达式30分钟入门教程(16)
6. EXT_ASSERT将ASSERT与if结合在一起(15)
7. static 变量初始化顺序引发的bug(14)
8. Some of the best Open Source Project's in VC++ & MFC(14)
9. malloc,new,VirtualAlloc,HeapAlloc性能(速度)比较(14)
10. 去掉PowerDesigner 15 在 Visual Studio 2008里的不兼容(13)
11. Flex与JSON及XML的互操作(12)
12. 猜猜看,id变成9了吗?(10)
13. 使用zlib压缩解压缩文件的详细过程(9)
14. VC9 用VC6的老字体 [VS2008 + Visual assister 1647的搭配蛮好](9)
15. VC OCX 打包CAB 网页发布全过程记录(8)
16. ZeroMQ 汇总(8)
17. 使用Flex Bison 和LLVM编写自己的编译器(7)
18. 跟腱炎----病友交流(7)
19. 膝盖过劳损伤----详细分类图片(特优文章)(7)
20. Ragel State Machine Compiler 的速度测试(7)
21. 聪明反被聪明误,一个bug(7)
22. 用Lex和Yacc做一个简单的SQL解释器(7)
23. yacc/lex windows 下 Parser Generator 使用指南(6)
24. 64位开发中去除64位平台的内存错误方法(6)
25. EmEditor编辑器帮助你批量替换文件名(6)
26. google ProtoBuf开发者指南(6)
27. C++ 标准库中的 allocator 是多余的(5)
28. 大文件内数据排序问题:采用文件映射内存技术(5)
29. 浅层数据结构(结构型)vs 深层数据结构(聚合型)(5)
30. 怎样在Word里面将字体背景颜色去掉?(5)
31. 云计算,炒作(5)
32. larbin结构分析(5)
33. 利用C++模板,代替虚函数,实现类的静态多态性(加入性能测试部分)(5)
34. Virtual / 虚函数之一、二、三、四......(5)
35. SOS, 请教:XML和struct之间相互转换的问题(5)
36. 美利达公爵 vs ATX740(4)
37. RSS利于发布什么样的内容(4)
38. 开区间与闭区间——从初等数学中吸取一点编程养分(4)
39. 词法分析(NFA与DFA)(4)
40. Nokia免费GPS导航 ovi地图 s60v5多语言(自带中文)完全版(4)