1. 意图
将一个类的接口转换成客户希望的另外一个接口. 解决接口不兼容问题.
2. 别名
包装器 Wrapper
4. 适用性
想使用一个已经存在的类. 而它的接口不符合你的要求.
5. 结构
6. 参与者
Target
----客户需要的接口.
Adaptee
----已经存在的一个接口.这个接口需要适配.
Adapter
----对Adaptee和Target接口进行适配.
在这里加入我们有一个接口:
class IRunnable
{
public:
IRunnable(){;}
virtual ~IRunnable(){;}
virtual void run() = 0;
};
一般来说,这个接口是用于线程上的。{
public:
IRunnable(){;}
virtual ~IRunnable(){;}
virtual void run() = 0;
};
比如:
IRunnable r;
Thread thr;
thr.Start(&r);
Thread thr;
thr.Start(&r);
线程的入口函数会运行IRunnable::run()方法。
在这里,我们要被线程运行就必须要从IRunnable这个接口继承下来,可是,现在我有一个类它本来是没有被设计为为多线程的,所以,我没有从IRunnable继承下来。可是现在,我需要它支持多线程,而且我已经不能让它从IRunnable继承下来了,或者是我不想修改它,这又如何是好呢?
这时候,我们就需要一个适配器了!
template <class C>
class RunnableAdapter: public IRunnable
{
public:
typedef void (C::*Callback)();
RunnableAdapter(C& object, Callback method): _pObject(&object), _method(method)
{
}
RunnableAdapter(const RunnableAdapter& ra): _pObject(ra._pObject), _method(ra._method)
{
}
~RunnableAdapter()
{
}
RunnableAdapter& operator = (const RunnableAdapter& ra)
{
_pObject = ra._pObject;
_method = ra._method;
return *this;
}
void run()
{
(_pObject->*_method)();
}
private:
RunnableAdapter();
C* _pObject;
Callback _method;
};
class RunnableAdapter: public IRunnable
{
public:
typedef void (C::*Callback)();
RunnableAdapter(C& object, Callback method): _pObject(&object), _method(method)
{
}
RunnableAdapter(const RunnableAdapter& ra): _pObject(ra._pObject), _method(ra._method)
{
}
~RunnableAdapter()
{
}
RunnableAdapter& operator = (const RunnableAdapter& ra)
{
_pObject = ra._pObject;
_method = ra._method;
return *this;
}
void run()
{
(_pObject->*_method)();
}
private:
RunnableAdapter();
C* _pObject;
Callback _method;
};
上面便是IRunnable的适配器。
现在好了,我们可以让不是从Runnable继承下来的类支持多线程了:
RunnableAdapter<MyClass> ra(myObject, &MyObject::doSomething));
Thread thr;
thr.Start(ra);
Hmmm,现在一切都OK了!Thread thr;
thr.Start(ra);