一般而言抽象和实现会在同一个类层次里,就像这样:
- interface SomeInterface { virtual void f() = 0; }
- class SomeImplementation : public SomeInterface { virtual void f() {} }
这种设计的好处在于用户只和接
口 交互,所以实现可以随意改变。但是接口的改变会影响到实现,所以当接口需要经常改变时,就可能需要桥接模式。
- class Abstract
- {
- public:
- virtual void f() = 0;
- private:
- Implementor* pImpl;
- };
- class Implementor
- {
- public:
- virtual void f_impl() = 0;
- };
通过桥接模式,抽象和实现被分隔成两个类层次,抽象和实现可以单独改变而不用影响对方。Abstract可以根据需要派生出子类,并调用Implementor中的方法。
- class ConcreteAbstract : public Abstract
- {
- void f() { pImpl->f_impl(); }
- };
使用桥接模式不只改变你的实现,也改变你的抽象。
PIMPL模式,或称为Private Class Data Pattern或Opaque Pointer,是一种隐藏类的内部实现细节的一种方式。
- class ExposedClass
- {
- public:
- void f() { pImpl->f(); }
- private:
- ImpClass* pImp;
- };
- class ImpClass
- {
- public:
- void f() { // do the real thing }
- private:
- Data1 d1;
- Data2 d2;
- };
客户只能看到公开类的API,却完全看不到类的数据以及内部实现。
桥接模式和PIMPL模式的区别:
Pimpl模式偏重于隐藏细节,而且ExposedClass和ImpClass都是具体类,将来一般不作为基类再扩展。
桥接模式偏重于抽象和实现的独立扩展。Abstract和Implementor都是抽象类,作为基类,将来两个类层次会独立扩展而互不影响。
阅读(1293) | 评论(0) | 转发(1) |