桥接模式是为了将对象的抽象与实现分离,使得它们可以独立变化。简简单单的一句话,却已经是站在了更高抽象层面上来看待、设计、解决问题。平常我们多是对具体问题进行分析、抽象,然后就开始设计,这对多数情况下基本完全够用,毕竟实际项目中的功能模块都是找一“最优解的"实现来解决掉问题,把功能设计出来即可。这种情况下的结构关系图参考如下:
这种抽象设计的缺点是:如果解决问题的方式不止一种,则必需为以上所有Concrete类都是实现对应的具体版本,这样不但类继承体系十分复杂,后期只要随便增加一种实现方式,都将要增加N个对应的新class。为解决这类问题,需要将问题的具体实现剥离出来单独抽象,并在问题抽象层面与实现抽象层面做个关联桥接即可。从而在问题抽象层面上,就不需要关心当前问题是如何被解决的(即:如何实现的)。改进后的类关系图(即:Bridge模式的类关系图参考如下):
从关系图中可看出,不论是日后增加新Target,还是扩展新实现方式,对于逻辑结构都不需要做调整,也不会因为扩展了新的实现而引起整个Target系列的动荡。模式的编码结构参考如下:
1 namespace bridge 2 { 3 class IImpl; 4 class ITarget 5 { 6 public: 7 virtual void doSomething() = 0; 8 // some code here........ 9 10 protected: 11 IImpl* getImpl() { return _impl; } 12 13 private: 14 IImpl* _impl; 15 16 };//class ITarget 17 18 class ConcreteTarget : public ITarget 19 { 20 public: 21 virtual void doSomething() override { 22 auto pImpl = this->getImpl(); 23 if (nullptr != pImpl) { 24 pImpl->realDoSomething(); 25 } 26 // some other code here........ 27 } 28 29 };//class ConcreteTarget 30 31 class IImpl 32 { 33 public: 34 virtual void realDoSomething() = 0; 35 36 };//class IImpl 37 38 class ConcreteImpl1 : public IImpl 39 { 40 public: 41 virtual void realDoSomething() override { /* some code here........ */ } 42 43 };//class ConcreteImpl1 44 45 class ConcreteImpl2 : public IImpl 46 { 47 public: 48 virtual void realDoSomething() override { /* some code here........ */ } 49 50 };//class ConcreteImpl2 51 52 }//namespace bridge
Bridge模式编码结构参考
时间: 2024-10-13 11:35:52