扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
二、结构图
(1)class adapter
(2)object adapter
三、实现
和其他很多模式一样,学习设计模式的重点是学习每种模式的思想,而不应拘泥于它的某种具体结构图和实现。因为模式是灵活的,其实现可以是千变万化的,只是所谓万变不离其宗。 在STL中大量运用了Adapter模式,象function adapter、iterator adpter,它们与这里说的adapter结构并不一样,但思想是一样的。具体的介绍可到侯捷网站上找相关文章,他讲得非常好。四、示例代码
(1)class adapter
namespace DesignPattern_Adapter // class Target // class Adapter 客户端代码: |
(2)object adapter namespace DesignPattern_Adapter
{ // class Target // class Adapter 客户端代码: |
六、实例
(1)STL中的Class Adapter
template stack() explicit stack(const _Container& _Cont) bool empty() const size_type size() const value_type& top() const value_type& top() const void push(const value_type& _Val) void pop() bool _Eq(const stack<_Ty, _Container>& _Right) const bool _Lt(const stack<_Ty, _Container>& _Right) const protected: |
关键之处在于_Container c,stack所有的操作都转交给c去处理了。(这实际上就是前面所说的"object adapter",注意STL中的class adapter与上面所说的class adapter概念不完全一致)
stack的使用方法很简单,如下:
{ int ia[] = { 1,3,2,4 }; deque stack } |
(2)近日看了一篇文章“Generic< Programming >:简化异常安全代码”,原文出自http://www.cuj.com/experts/1812/alexandr.htm?topic=experts, 中文译文出自"C++ View第5期"。 文章绝对一流,作者给出的代码中也使用了Adaptor模式,也有一定代表性。我将其问题一般化,概括出以下示例:
问题:假设有几个已有类,他们有某些共同的行为,但它们彼此间是独立的(没有共同的基类)。如:
class T1 class T2 // ... |
如何以统一的方式去调用这些行为呢?
解决方法1:很自然的会想到用模板,如:
template <class T> void Test(T t) { t.Proc() ; } |
的确不错,但这只适用于简单的情况,有时情况是很复杂的,比如我们无法把类型放到模板参数中!
解决方法2:困难来自于这些类没有共同的基类,所以我们就创造一个基类,然后再Adapt。
// class IAdaptor,抽象基类 class IAdaptor { public: virtual void Proc() = 0 ; } ; // class Adaptor template <class T> class Adaptor : public IAdaptor, private T //实现继承 { public: virtual void Proc() { T::Proc() ; } } ; // 以统一方式调用函数Proc,而不关心是T1、T2或其他什么类 void Test(const std::auto_ptr { sp->Proc() ; } 客户端代码: Test(std::auto_ptr Test(std::auto_ptr |
上例很简单,用方法一中的模板函数就可以很好地解决了。下面是一个略微复杂一点的例子,根据参数类型来创建适当的对象:
class T1 class T2 // class IAdaptor,抽象基类 // class Adaptor class Test void Proc() { sp->Proc() ; } 客户端代码: Test t2('c') ; |
上面是示例而非实例,你也许更愿意看看它实际的运用。去下载作者所写的代码,好好欣赏一下吧。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者