桥接模式:将抽象部分与现实部分分离,使它们都可以独立变换。
以下情形考虑使用桥接模式:
1.当一个对象有多个变化因素的时候,考虑依赖于抽象的实现,而不是具体的实现。
2.当多个变化因素在多个对象间共享时,考虑将这部分变化的部分抽象出来再聚合/合成进来。
3.当一个对象的多个变化因素可以动态变化的时候。
优点:
将实现抽离出来,再实现抽象,使得对象的具体实现依赖于抽象,满足了依赖倒转原则。
更好的可扩展性。
可动态的切换实现。桥接模式实现了抽象和实现的分离,在实现桥接模式时,就可以实现动态的选择具体的实现。
/* 关键代码:将现实独立出来,抽象类依赖现实类。 以下示例中,将各类App、各类手机独立开来,实现各种App和各种手机的自由桥接。 */ #include <iostream> using namespace std; //抽象App类,提供接口 class App { public: virtual ~App(){cout << "~App()" << endl;} virtual void run() = 0; }; //具体的App实现类 class GameApp:public App { public: void run() { cout << "GameApp Running" << endl; } }; //具体的App实现类 class TranslateApp:public App { public: void run() { cout << "TranslateApp Running" << endl; } }; //抽象手机类,提供接口 class MobilePhone { public: virtual ~MobilePhone(){ cout << "~MobilePhone()" << endl;} virtual void appRun(App *app) = 0; // 实现App与手机的桥接 }; //具体的手机类实现 class HuaWei:public MobilePhone { public: void appRun(App *app) { cout << "HuaWei" <<endl; app->run(); } } int main() { App *gameApp = new GameApp; App *translateApp = new TranslateApp; MobilePhone *mi = new XiaoMi; MobilePhone *hua = new HuaWei; mi->appRun(gameApp); mi->appRun(translateApp); hua->appRun(gameApp); hua->appRun(translateApp; delete hua; hua = nullptr; delete mi; }