随笔-4  评论-40  文章-117  trackbacks-0

4.1 Adapter(适配器)-类对象结构型模式 - 设计模式


1. 意图

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

2. 别名

包装器 Wrapper

4. 适用性

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


5. 结构

 

6. 参与者

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



在这里加入我们有一个接口:
class IRunnable
{
public:
    IRunnable()
{;}
    
virtual ~IRunnable(){;}

    
virtual void run() = 0;
}
;
一般来说,这个接口是用于线程上的。
比如:
IRunnable 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;
}
;

上面便是IRunnable的适配器。

现在好了,我们可以让不是从Runnable继承下来的类支持多线程了:
RunnableAdapter<MyClass> ra(myObject, &MyObject::doSomething));

Thread thr;
thr.Start(ra);
Hmmm,现在一切都OK了!
posted on 2008-05-04 16:53 李阳 阅读(546) 评论(0)  编辑 收藏 引用 所属分类: C++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理