Published by orzz.org(). (http://orzz.org/c%e8%ae%be%e8%ae%a1%e6%a8%a1%e5%bc%8f%e4%b9%8bbridge%e6%a1%a5%e6%8e%a5%e6%a8%a1%e5%bc%8f/)
当我们面临两个相互独立的变化作用到同一个逻辑对象上时,往往会导致设计的尴尬局面。
比如说,当我们要抽象“服装”这个概念,我们会得到如“衣服”、“裤子”、“帽子”的样式分类方式,同样也会得到如“绿色”、“红色”、“彩色”的颜色分类方式,还可以得到“冬装”、“春装”、“夏装”的时令分类方式。
每一种不同的分类方式之间都是平行的,都代表了一种可能的变化方式。若我们使用单纯的接口方式来抽象变化,我们只能对其中一种变化做出抽象,剩下的其他变化,只有被生硬而重复的拓展,毫无维护的便捷性。
事物的变化有很多,我们可以把事物可能的变化抽象并封装,使用接口的思想来访问,这样我们就可以很好的管理各种不同的变化方式。
使对象能够适应多个平行变化的模式,就是Bridge(桥接)模式。它将多种不同的变化独立的抽象,并分别实现它们。
如上图,我们希望不同的变化能够独立的生长,而不是纠结在一起难以分开。为了做到这点,我们需要先针对不同的变化做独立的抽象,然后再使用组合的思想,把接口之间连接起来。
C++示例如下:
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
////////////////////////////////////////////////////////////////// // 桥接模式 C++示例 // // Author: 木头云 // Blog: http://darkc.at // E-Mail: memleak@darkc.at // Version: 1.0.820.1756(2009/08/20) ////////////////////////////////////////////////////////////////// #include "stdafx.h" ////////////////////////////////////////////////////////////////// // 实现接口类 class IImplementor abstract { public: virtual ~IImplementor() { } public: virtual void OperationImp() = 0; }; // 具体实现类 class CConcreteImplementorA : public IImplementor { public: virtual void OperationImp() { _tcout << _T("具体实现A") << endl; } }; class CConcreteImplementorB : public IImplementor { public: virtual void OperationImp() { _tcout << _T("具体实现B") << endl; } }; ////////////////////////////////////////////////////////////////// // 抽象接口类 class IAbstraction abstract { public: virtual ~IAbstraction() { } protected: TSmartPtr<IImplementor> implementor; public: void SetImplementor(const TSmartPtr<IImplementor>& imp) { implementor = imp; } virtual void Operation() = 0; }; // 具体抽象类 class CRefinedAbstractionA : IAbstraction { public: virtual void Operation() { _tcout << _T("抽象A的"); implementor->OperationImp(); } }; class CRefinedAbstractionB : IAbstraction { public: virtual void Operation() { _tcout << _T("抽象B的"); implementor->OperationImp(); } }; ////////////////////////////////////////////////////////////////// // 主函数 int _tmain(int argc, _TCHAR* argv[]) { TSmartPtr<IAbstraction> ab; ab = new CRefinedAbstractionA; ab->SetImplementor(new CConcreteImplementorA); ab->Operation(); // 调用抽象A的实现A ab->SetImplementor(new CConcreteImplementorB); ab->Operation(); // 调用抽象A的实现B ab = new CRefinedAbstractionB; ab->SetImplementor(new CConcreteImplementorA); ab->Operation(); // 调用抽象B的实现A ab->SetImplementor(new CConcreteImplementorB); ab->Operation(); // 调用抽象B的实现B return 0; } ////////////////////////////////////////////////////////////////// /* Bridge模式将具体实现的接口再次抽象为统一的接口. 它将接口的变化封装,使得当接口变化时我们不需要再针对新出现的接口增加或修改大量的实现类. 当实现类的接口需要针对两个或以上更多的条件而改变时,此时使用Bridge模式将相当有效. 它将其中的一部分条件封装,从而提供仅针对单一条件变化的稳定接口. */ ////////////////////////////////////////////////////////////////// |