桥接模式 Bridge
《大话设计模式》中就Bridge模式的解释:
手机品牌和软件是两个概念,不同的软件可以在不同的手机上,不同的手机可以有相同的软件,两者都具有很大的变动性。如果我们单独以手机品牌或手机软件为基类来进行继承扩展的话,无疑会使类的数目剧增并且耦合性很高,(如果更改品牌或增加软件都会增加很多的变动)两种方式的结构如下:
所以将两者抽象出来两个基类分别是PhoneBrand和PhoneSoft,那么在品牌类中聚合一个软件对象的基类将解决软件和手机扩展混乱的问题,这样两者的扩展就相对灵活,剪短了两者的必要联系,结构图如下:
// Bridge.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> using namespace std; class PhoneSoft{ public: virtual void run()=0; }; class PlayBallGame:public PhoneSoft{ public: void run(){ cout<<"playball"<<endl; } }; class AddressList:public PhoneSoft{ public: void run(){ cout<<"addresslist"<<endl; } }; class PhoneBrand{ public: virtual void setSoft(PhoneSoft * p) = 0; virtual void run() = 0; protected: PhoneSoft * psoft; }; class Nokia:public PhoneBrand{ public: void setSoft(PhoneSoft * p){ this->psoft = p; } void run(){ cout<<"Nokia : "; this->psoft->run(); } }; class Moto:public PhoneBrand{ public: void setSoft(PhoneSoft * p){ this->psoft = p; } void run(){ cout<<"Moto : "; this->psoft->run(); } }; int main(int argc, char* argv[]) { PhoneBrand * pphone = new Moto; pphone->setSoft(new AddressList); pphone->run(); pphone->setSoft(new PlayBallGame); pphone->run(); return 0; }