Adapter(适配器)模式

1. 意图

将一个类的接口转换成客户希望的另外一个接口. 解决接口不兼容问题.

2. 别名

包装器 Wrapper

4. 适用性

想使用一个已经存在的类. 而它的接口不符合你的要求.


5. 结构

Adapter(适配器)模式

 

6. 参与者

Target
    ----客户需要的接口.
Adaptee
    ----已经存在的一个接口.这个接口需要适配.
Adapter
    ----对Adaptee和Target接口进行适配.



在这里加入我们有一个接口:
Adapter(适配器)模式class IRunnable
Adapter(适配器)模式{
Adapter(适配器)模式public:
Adapter(适配器)模式    IRunnable(){;}
Adapter(适配器)模式    virtual ~IRunnable(){;}
Adapter(适配器)模式
Adapter(适配器)模式    virtual void run() = 0;
Adapter(适配器)模式}
;
一般来说,这个接口是用于线程上的。
比如:
Adapter(适配器)模式IRunnable r;
Adapter(适配器)模式Thread thr;
Adapter(适配器)模式thr.Start(&r);

线程的入口函数会运行IRunnable::run()方法。
在这里,我们要被线程运行就必须要从IRunnable这个接口继承下来,可是,现在我有一个类它本来是没有被设计为为多线程的,所以,我没有从IRunnable继承下来。可是现在,我需要它支持多线程,而且我已经不能让它从IRunnable继承下来了,或者是我不想修改它,这又如何是好呢?
这时候,我们就需要一个适配器了!

Adapter(适配器)模式template <class C>
Adapter(适配器)模式class RunnableAdapter: public IRunnable
Adapter(适配器)模式{
Adapter(适配器)模式public:
Adapter(适配器)模式    typedef void (C::*Callback)();
Adapter(适配器)模式    
Adapter(适配器)模式    RunnableAdapter(C& object, Callback method): _pObject(&object), _method(method)
Adapter(适配器)模式    {
Adapter(适配器)模式    }

Adapter(适配器)模式    
Adapter(适配器)模式    RunnableAdapter(const RunnableAdapter& ra): _pObject(ra._pObject), _method(ra._method)
Adapter(适配器)模式    {
Adapter(适配器)模式    }

Adapter(适配器)模式
Adapter(适配器)模式    ~RunnableAdapter()
Adapter(适配器)模式    {
Adapter(适配器)模式    }

Adapter(适配器)模式
Adapter(适配器)模式    RunnableAdapter& operator = (const RunnableAdapter& ra)
Adapter(适配器)模式    {
Adapter(适配器)模式        _pObject = ra._pObject;
Adapter(适配器)模式        _method  = ra._method;
Adapter(适配器)模式        return *this;
Adapter(适配器)模式    }

Adapter(适配器)模式
Adapter(适配器)模式    void run()
Adapter(适配器)模式    {
Adapter(适配器)模式        (_pObject->*_method)();
Adapter(适配器)模式    }

Adapter(适配器)模式    
Adapter(适配器)模式private:
Adapter(适配器)模式    RunnableAdapter();
Adapter(适配器)模式
Adapter(适配器)模式    C*       _pObject;
Adapter(适配器)模式    Callback _method;
Adapter(适配器)模式}
;

上面便是IRunnable的适配器。

现在好了,我们可以让不是从Runnable继承下来的类支持多线程了:
Adapter(适配器)模式RunnableAdapter<MyClass> ra(myObject, &MyObject::doSomething));
Adapter(适配器)模式
Adapter(适配器)模式Thread thr;
Adapter(适配器)模式thr.Start(ra);
Hmmm,现在一切都OK了!
上一篇:CYQ.Data 数据框架 V3.0 版本 开放源码下载有[CYQ.Blog(秋色园QBlog) 完全开放所有源码]


下一篇:周四直播预告:Sentinel - 保障微服务高可用的利器