桥接模式(bridge)c++版

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

/*
 * bridge.cpp
 *
 *  Created on: Oct 13, 2017
 *      Author: [email protected]
 *      桥接模式:将抽象部分与它的实现部分分离,
 *              使它们都可以独立的变化。
 *              实现指的是抽象类和他的派生类用来实现自己的对象。
 *
 */

#include 
using namespace std;

class HandsetSoft
{
public:
    virtual ~HandsetSoft(){}
    virtual void Run()=0;
};

//手机游戏
class HandsetGame:public HandsetSoft
{
public:
    //实现run函数
    void Run() override
    {
        cout<<"运行手机游戏。"<public HandsetSoft
{
public:
    //实现run函数
    void Run() override
    {
        cout<<"运行手机通讯录。"<//手机品牌
class HandsetBrand
{
public:
    virtual ~HandsetBrand(){}
    //设置手机软件
    void SetHandsetSoft(HandsetSoft* soft){soft_ = soft;}
    virtual void Run()=0;
protected:
    HandsetSoft* soft_;
};

//手机品牌N
class HandsetBrandN:public HandsetBrand
{
public:
    //运行软件
    void Run() override
    {
        cout<<"N手机运行软件"<Run();
    }
};

//手机品牌M
class HandsetBrandM:public HandsetBrand
{
public:
    //运行软件
    void Run() override
    {
        cout<<"M手机运行软件"<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

你可能感兴趣的:(编程,设计模式)