随笔 - 45  文章 - 129  trackbacks - 0
<2007年4月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

专注于C++ P2P STL GP OpenSource等
Google

常用链接

留言簿(10)

随笔分类

随笔档案

相册

朋友

搜索

  •  

最新评论

阅读排行榜

评论排行榜

版权所有 未经作者允许 不得用于商业用途 转载请附带这第一,二行
http://www.cppblog.com/shenhuafeng/

Modern C++ Design的第一章就是Policy Based Class Design,可见该技术是整个Loki库的设计基础.这种方式的优点是能够增加程序库的弹性和提高复用性.
简单来说就是,一个Policy Based Class由很多基本的Policy来组成的,每个Policy Class代表了该复杂类(相对复杂)类的某些行为或者特性.有点类似于类的继承,当然和类的继承是不同的。
那么Policy Based Class有什么用呢?我们先看下面这个问题。
假如需要设计一个基础库,可能是基于某个特定领域的,那么库的设计者就需要考虑这样的问题,他需要将未来的可能的需求加以分类,抽象出层次,然后运用OO思想,希望能够构造出一个开发的结构,当然其中的component的设计当然是越是灵活越好。
用传统的OO设计思想,可能可以设计出一套非常完善的类库 ,可能包罗万象。当然的对于应用开发人员需要花很多时间去学习这个“包罗万象”的基础类库。而且往往这样的基础库不是通用性不强就是限制条件太多(例如MFC)可以说就是这样一种类型的库。

下面要展示一下运用多重继承以及Templetes来实现的policy class,举一个简单的例子:
假如我们需要发明一个灯,它有不同的种类,有使用不同能源的工作方式以及有不同的操作方式,如果运用

policy based class来设计的话,可能是这样的结构:

 1 templete <
 2      class  T,
 3     templete  < class >   class  Work,
 4     templete  < class >   class  OpMethod
 5 >
 6 class  Light
 7     : public  Work < T > ,
 8         OpMethod < Light >
 9
10 {
11     T *  xxOp()
12      {
13          if (Work(T).Status  ==  ACMODE)
14             OpMethod( * this );
15     }

16 }


当你实例化一个Policy Based Class的时候,你还可以给出默认的实现,就像成员函数声明和定义时候给出的默认参数一样。

回头来看一下多重继承和Templetes的特性:
多重继承:欠缺一种一成不变的可以套用的代码,在某种受控的情况下将继承的Class组合起来(多重继承只是将他们放在一起,然后提供一种访问方式)。Templetes:有这样的特性。
多重继承由于继承自多个Base Class,所以型别信息缺乏,而Templetes正式基于型别的。
多重继承容易扩张,而Templetes的特化不容易扩张。

正是两项技术的互补,才使这样的技术实现成为可能。
Light对象继承多个policy class,使得特性得以在编译期间定值,从而实现Light Class功能的扩张。
而Templetes技术使得大部分Work以及OpMethod能够共享大部分基础代码,而对特定的版本实现定值。

这样的好处就是,应用程序开发人员得以在应用设计时期,使用这些Class,选择适合自己的Policy组装自己的代码,从而使得程序大小得以精减,运行速率得以提高,而不必去包含整个又大又全的基础类库。

以上只是一些学习的心得和体会,如果有不对的地方,希望大家多多指教。


FeedBack:
# re: Modern C++ Design 学习笔记之Policy Based Class Design 2006-09-14 09:24 梦在天涯
LOki boost 是c++的精华,很值的学习,非常感谢能跟大家分享  回复  更多评论
  
# re: Modern C++ Design 学习笔记之Policy Based Class Design 2006-09-14 09:39 CPP&&设计模式小屋
恩 先学习一下loki库 然后再研究研究Boost库。  回复  更多评论
  
# re: Modern C++ Design 学习笔记之Policy Based Class Design 2006-09-30 10:09 空明流转
在Policy-base的设计中,大部分的Policy不一定要被继承的,因为Policy表达的是一种供选择的行为,而很多供选择的行为都可能是纯功能性的,使用“委托”便能轻松完成这一工作,只有当Policy需要深入了解它的生成类的情况的时候(例如Creator这样的构造选择子),才需要继承。  回复  更多评论
  
# re: Modern C++ Design 学习笔记之Policy Based Class Design 2007-09-04 09:05 蚂蚁终结者
Loki库确实经典,不过偶还连STL源码剖析都没时间看完呢  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理