看代码设计中的“隐形接口”
我们都知道在做一个继承层次的设计时,最好把顶层的类写成抽象的,并且是对外的接口。
于是这样一个继承结构对外就表示一致的和可预期的行为,接口的好处就是可以屏蔽一些内部的
逻辑过程,而外部用户并不关心的。
最近在学习库设计时,发现了一种隐形接口,它可以让同一层次的类具有相同的能力,但逻辑上
没有任何关系,换句话说就是耦合很松。一个应用就是c++标准模板库。
STL 是由容器 迭代器 算法 3大部分组成,都是基于模板的设计,其中容器还使用了policy 来分配 (Alloc)。容器和容器之间并无某种联系,但他们都遵从一个隐形的接口,都支持迭代器, 都有默认的
如:
pointer _M_start;
pointer _M_finish;
typedef _Tp* pointer;
typedef _Tp value_type;
typedef value_type* pointer;
typedef const value_type* const_pointer;
typedef value_type* iterator;
typedef const value_type* const_iterator;
typedef value_type& reference;
typedef const value_type& const_reference;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef random_access_iterator_tag _Iterator_category;
这些东西就是隐形接口,它提供了算法对类内部实现的透明性,任何标准容器都有这些已经规定好的,算法想用什么调用就行了。这样算法就可以写 reference XXX、pointer XXX 、不用管是什么容器了。
这种隐形规定初次使用需要记忆东西多些,而了解这些来扩展这个团体就会获得成倍的好处,这与继承异曲同工,但还比之弱耦合,效率也为高。
算法中适配器 unary,binary,memfun 等也是为了配合这种隐形接口而产生的。
于是这样一个继承结构对外就表示一致的和可预期的行为,接口的好处就是可以屏蔽一些内部的
逻辑过程,而外部用户并不关心的。
最近在学习库设计时,发现了一种隐形接口,它可以让同一层次的类具有相同的能力,但逻辑上
没有任何关系,换句话说就是耦合很松。一个应用就是c++标准模板库。
STL 是由容器 迭代器 算法 3大部分组成,都是基于模板的设计,其中容器还使用了policy 来分配 (Alloc)。容器和容器之间并无某种联系,但他们都遵从一个隐形的接口,都支持迭代器, 都有默认的
如:
pointer _M_start;
pointer _M_finish;
typedef _Tp* pointer;
typedef _Tp value_type;
typedef value_type* pointer;
typedef const value_type* const_pointer;
typedef value_type* iterator;
typedef const value_type* const_iterator;
typedef value_type& reference;
typedef const value_type& const_reference;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef random_access_iterator_tag _Iterator_category;
这些东西就是隐形接口,它提供了算法对类内部实现的透明性,任何标准容器都有这些已经规定好的,算法想用什么调用就行了。这样算法就可以写 reference XXX、pointer XXX 、不用管是什么容器了。
这种隐形规定初次使用需要记忆东西多些,而了解这些来扩展这个团体就会获得成倍的好处,这与继承异曲同工,但还比之弱耦合,效率也为高。
算法中适配器 unary,binary,memfun 等也是为了配合这种隐形接口而产生的。
posted on 2007-04-13 10:47 康国庆--thinkinlove 阅读(1519) 评论(3) 收藏 举报