(C++设计模式) ------Bridge模式-- 结构型模式
设计模式的学习是一个循序渐进的过程,每一个设计师都是在套用这几种设计模式来实现自己的软件构架,很多都是融合会贯通的,一个设计模式中不仅仅是用到一种,所以要灵活运用这些设计模式。理解了设计模式对设计和代码的阅读都有很大的好处!!
今天我们学习结构性模式Bridge模式。
桥梁模式:将抽象化与实现化脱耦,使得二者可以独立的变化,也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合 / 聚合关系而不是继承关系,从而使两者可以独立的变化。
聚合:
组合:
Bridge模式有时候类似于多继承方案,但是多继承方案往往违背单一职责原则(即一个类只有一个变化的原因),复用性比较差。Bridge模式是比多继承方案更好的解决方法。
适用性:
■你不希望在抽象和它的实现部分之间有一个固定的绑定关系。例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换(动态耦合)。
■类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这时Bridge模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。
■设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。
■(c++)你想对客户完全隐藏抽象的实现部分。在c++中,类的表示在类接口中是可见的。
■你想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。
缺点:
■客户必须要选择哪一种具体的实现。
下面是引用http://blog.csdn.net/wuzhekai1985的代码实现:
给出C++的一种实现:
//操作系统 class OS { public: virtual void InstallOS_Imp() {} }; class WindowOS: public OS { public: void InstallOS_Imp() { cout<<"安装Window操作系统"<<endl; } }; class LinuxOS: public OS { public: void InstallOS_Imp() { cout<<"安装Linux操作系统"<<endl; } }; class UnixOS: public OS { public: void InstallOS_Imp() { cout<<"安装Unix操作系统"<<endl; } }; //计算机 class Computer { public: virtual void InstallOS(OS *os) {} }; class DellComputer: public Computer { public: void InstallOS(OS *os) { os->InstallOS_Imp(); } }; class AppleComputer: public Computer { public: void InstallOS(OS *os) { os->InstallOS_Imp(); } }; class HPComputer: public Computer { public: void InstallOS(OS *os) { os->InstallOS_Imp(); } };
客户使用方式:
代码中没有很明显的体现出抽象类和实现类之间的聚合关系,做了一下修改:
//计算机 class Computer { public: virtual void InstallOS(OS *os) {} }; class DellComputer: public Computer { public: void DellComputer(OS *os) { this->os = os } void InstallOS() {os->InstallOS_Imp(); } private: OS * os; }; class AppleComputer:public Computer { public: void AppleComputer(OS *os) { this->os = os } void InstallOS() {os->InstallOS_Imp(); } private: OS *os; }; class HPComputer: public Computer { public: void HPComputer(OS *os) { this->os = os } void InstallOS() { os->InstallOS_Imp(); } private : OS* os; };
操作系统部分不变。
客户使用方式:
两种实现方法没有太大的区别,不过这个方法能在抽象类里很好的体现聚合的关系,比如计算机类中抽象类的部分中实现类以数据成员的形式聚合在抽象类中。
ok学习完毕,以后有新的想法在补充!