一、功能
将一个类的接口转换成客户希望的另外一个接口,解决两个已有接口之间不匹配的问题。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
二、结构图
(1)class adapter
(2)object adapter
三、实现
和其他很多模式一样,学习设计模式的重点是学习每种模式的思想,而不应拘泥于它的某种具体结构图和实现。因为模式是灵活的,其实现可以是千变万化的,只是所谓万变不离其宗。 在STL中大量运用了Adapter模式,象function adapter、iterator adpter,它们与这里说的adapter结构并不一样,但思想是一样的。具体的介绍可到侯捷网站上找相关文章,他讲得非常好。
四、示例代码
(1)class adapter
namespace DesignPattern_Adapter{// class Adaptee class Adaptee { public: void SpecialRequest() {} } ;// class Target class Target { public: virtual void Request() = 0 ; } ;// class Adapter class Adapter : public Target, private Adaptee { public: virtual void Request() { SpecialRequest() ; } } ;}//客户端代码:{ using namespace DesignPattern_Adapter ; Target *p = new Adapter() ; p->Request() ; //实际上调用的是Adaptee::SpecialRequest()}
(2)object adapter
namespace DesignPattern_Adapter{ // class Adaptee class Adaptee { public: void SpecialRequest() { } }; // class Target class Target { public: virtual void Request() = 0; }; // class Adapter class Adapter : public Target { public: virtual void Request() { _adaptee.SpecialRequest(); } private: Adaptee _adaptee; };}//客户端代码:{ using namespace DesignPattern_Adapter; Target *p = new Adapter(); p->Request(); //实际上调用的是Adaptee::SpecialRequest()}
六、实例
(1)STL中的Class Adapter
STL中的Adapter Class包括:a.stack(对应的adaptee是deque)。b.queue(对应的adaptee是deque)。c.priority_queue(对应的adaptee是vector)。 下面是从VC中的< stack >拷出的stack的类定义:
templateclass _Container = deque<_Ty> >class stack{ // LIFO queue implemented with a containerpublic: typedef _Container container_type; typedef typename _Container::value_type value_type; typedef typename _Container::size_type size_type; stack() : c() { // construct with empty container } explicit stack(const _Container& _Cont) : c(_Cont) { // construct by copying specified container } bool empty() const { // test if stack is empty return (c.empty()); } size_type size() const { // test length of stack return (c.size()); } value_type& top() { // return last element of mutable stack return (c.back()); } const value_type& top() const { // return last element of nonmutable stack return (c.back()); } void push(const value_type& _Val) { // insert element at end c.push_back(_Val); } void pop() { // erase last element c.pop_back(); } bool _Eq(const stack<_Ty, _Container>& _Right) const { // test for stack equality return (c == _Right.c); } bool _Lt(const stack<_Ty, _Container>& _Right) const { // test if this < _Right for stacks return (c < _Right.c); }protected: _Container c; // the underlying container};
关键之处在于_Container c,stack所有的操作都转交给c去处理了。(这实际上就是前面所说的"object adapter",注意STL中的class adapter与上面所说的class adapter概念不完全一致)
原文链接: https://www.cnblogs.com/chain2012/archive/2011/01/05/1926663.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/19675
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!