桥接模式(bridge)c++版

来源:互联网 发布:英克软件售后 编辑:程序博客网 时间:2024/06/14 08:46

这是大话设计模式中桥接模式的c++版本

/* * bridge.cpp * *  Created on: Oct 13, 2017 *      Author: clh01s@163.com *      桥接模式:将抽象部分与它的实现部分分离, *              使它们都可以独立的变化。 *              实现指的是抽象类和他的派生类用来实现自己的对象。 * */#include <iostream>using namespace std;class HandsetSoft{public:    virtual ~HandsetSoft(){}    virtual void Run()=0;};//手机游戏class HandsetGame:public HandsetSoft{public:    //实现run函数    void Run() override    {        cout<<"运行手机游戏。"<<endl;    }};class HandsetAddressList:public HandsetSoft{public:    //实现run函数    void Run() override    {        cout<<"运行手机通讯录。"<<endl;    }};//手机品牌class HandsetBrand{public:    virtual ~HandsetBrand(){}    //设置手机软件    void SetHandsetSoft(HandsetSoft* soft){soft_ = soft;}    virtual void Run()=0;protected:    HandsetSoft* soft_;};//手机品牌Nclass HandsetBrandN:public HandsetBrand{public:    //运行软件    void Run() override    {        cout<<"N手机运行软件"<<endl;        HandsetBrand::soft_->Run();    }};//手机品牌Mclass HandsetBrandM:public HandsetBrand{public:    //运行软件    void Run() override    {        cout<<"M手机运行软件"<<endl;        HandsetBrand::soft_->Run();    }};int main(){//实例化手机品牌N    HandsetBrandN abn;    abn.SetHandsetSoft(new HandsetGame());    abn.Run();    abn.SetHandsetSoft(new HandsetAddressList());    abn.Run();//实例化手机品牌M    HandsetBrandM abm;    abm.SetHandsetSoft(new HandsetGame());    abm.Run();    abm.SetHandsetSoft(new HandsetAddressList());    abm.Run();    return 0;}

运行结果:

clh@clh:~/testcode/设计模式$ ./a.out N手机运行软件运行手机游戏。N手机运行软件运行手机通讯录。M手机运行软件运行手机游戏。M手机运行软件运行手机通讯录。

以下内容摘抄自《设计模式》
桥接模式的动机:
当一个抽象可能有多个实现时,通常用继承来协调它们。抽象类定义对该抽象的接口,而具体的子类则用不同的方式加以实现。但是此方法有时不够灵活。继承机制将抽象部分与它的实现部分固定在一起,使得难以对抽象部分和实现部分独立的进行修改、扩充和重用。

桥接模式的使用情况:
1.你希望在抽象和它的实现部分之间有一个固定的绑定关系。例如这种情况可能是因为,在程序运行时刻实现部分应该可以被选择或者切换。
2.类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这时bridge模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。
3.对一个抽象的实现部分的修改应对客户不产生影响,即客户代码不必重新编译。
4.(c++)你相对客户完全隐藏抽象的实现部分。在C++中,类的表示在类的接口中是可见的。
5.如果你需要生成许多相同功能的类(比如不同系统中的相同的功能的类)。这样一种情况说明你必须将一个对象分解成连个部分。
6.你想在多个对象间共享实现(可能使用引用计数)。但同时要求客户并不知道这一点。

桥接模式的优点:
1.分离接口以及实现部分 一个实现未必不变的绑定在一个接口上。抽象类的实现可以在运行时刻进行配置,一个对象甚至可以在运行时刻改变他的实现。而且改变一个实现类的时候客户不必要重新进行编译。
另外接口与实现的分离有助于分层,从而产生更好的结构化系统,系统高层仅需要知道abstraction和implementor即可。
2.提高可扩充性 可以独立的扩充abstraction和implementor。
3.实现细节对用户透明 你可以对用户隐藏细节,例如共享implementor对象以及相应的引用计数机制(如果有的话)
转载请注明原地址:http://blog.csdn.net/clh01s

原创粉丝点击