代码改变世界

C++设计模式之Adapter模式

2011-01-05 19:10  chainchan  阅读(538)  评论(2编辑  收藏  举报

一、功能

  将一个类的接口转换成客户希望的另外一个接口,解决两个已有接口之间不匹配的问题。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 container
public:
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概念不完全一致)