无痛醒砖工

码着码着,就湿了
Wrapper模板

为什么要用Wrapper模板?
 
         很多时候,工程项目里要写很多个子类,都要继承同一个父类,以实现多态(各种设计模式就不多说了)。同一类簇(这里指前面提到的各种相关类,父类+子类)可能需要实现很多类似的业务代码。由此产生大量的重复劳动,而且一不小心写错将导致不一致BUG。C++使用模板可以保证一致性,减少BUG、减少团队大量的瞎折腾。另外常见的模板template<class T>其中T是无法调用内部函数的,一个解决方案就是使用wrapper将原本的类包裹一层,以使用其中各种方法。通过模板实现什么工厂模式啊、XX模式啊就轻松了,基本可以一套模板通用,就是常说的抽象XX模式。
         
 

使用Wrapper
 
1. 声明一个公共接口 

1 class ObjInterface
2 {
3 public:
4     virtual void SayHello() = 0;
5 } ;


2. 公共父类

class Object : public ObjInterface
{
public:
    virtual void SayHello();
};

 

3. 各种子类Obj1 Obj2 .. ObjN继承自Object

4.定义一个 TObjWrapper

template<class T>
class   TObjWrapper
{
private:
    ObjInterface *interface;
public:
    ObjWrapper(T  *obj) 
    {
        interface = (ObjInterface *)obj;
    }

    ~ObjWrapper();

    void SayHello()
    {
        //TODO: 安全检查
        interface->SayHello();
    }
}; 

一些实例 

template<class T>
class TFactory
{
public:
    static T * Create()
    {
            TObjectWrapper<T> _wrapper(NULL); 
            _wrapper->Create();
            return (T *)_wrapper; // 重载T *函数返回产生的指针
    }
};


使用:Car *car = TFactory<Car>::Create()

后记

    Wrapper模板可以将您所需要调用的接口封装起来,供其他模板使用,以节约大量冗余代码。使用方便轻巧,易查BUG。不过模板一旦发生打错指针啊神马的问题编译器报错比较乱。
    本文随性而发,,难免有考虑不周,还请指正。

posted on 2013-03-14 23:17  cydonia  阅读(1789)  评论(0编辑  收藏  举报