C++桥接设计模式(impl)

来源:互联网 发布:淘宝差评申诉成功几率 编辑:程序博客网 时间:2024/06/05 20:59
  本文简单介绍C++中的桥接设计模式。主要是为了隐藏数据以及减轻编译时的压力。

   通常的做法是另外定义一个新的类,其接口和原来的类一致,但是其数据全部隐藏在新的类中。例如我们定义A类,然后定义一个新类B和其有相同的接口,其数据成员都在新类中。引用A类的代码就不需要重新编译。    

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
classCimpl; // forward declaration
classC {
    public:
        C(intval);
        ~C();
        intget_a() const;
        intget_b() const;
    private:
        Cimpl *impl_;
};
                                 
classCimpl {
    public:
        Cimpl(intval):a_(val), _(a_){}
        ~Cimpl();
        intget_a() const{return a_;}
        intget_b() const{return b_;}
    private:
        inta_;
        intb_;
};
                                 
C::C(intval): impl_(newCimpl(val)){}
C::~C(){ deleteimpl_;}
int C::get_a() { return impl_->get_a();}
int C::get_b() { return impl_->get_b();}

   C中的代码如果不发生变化其内存布局就不会发生变化。以后只要修改实现类Cimpl即可。这种被称为编译防火墙。这种技术被广泛应用,也被成为”pimpl用法“,“柴郡猫技术” (Cheshire Cat technique)。使用这种技术后我们代码使用C类不必重新编译。

   但是使用这种技术也会带来缺点。第一,内联函数失效,因为都是使用另外的调用实现的。第二,原来只需要一个类,现在用2个类来表示。