设计模式之类对象结构型 — BRIDGE (桥接)模式

意图

将抽象部分与他的实现部分分离,使他们都可以独立的变化

实现

参考我的这篇文章(点这里),之前已经总结过了,就不重复了。
注意:之前仅仅是对代码依赖性的考虑,这次是在之前的基础上增加了控制不同实现的效果

代码示例

注意:这是完整的示例代码 vs2013编译通过

//windows.h 文件
#pragma once

#include <iostream>
using namespace std;

//使用声明式   降低耦合
class WindowsImp;
class Windows
{
public:
    Windows();
    virtual ~Windows();

    virtual void paint(){};
    virtual void drawContents(){};

protected:
    WindowsImp *getWindowImp();

private:
    WindowsImp *m_imp;
};



class IcoWindows:public Windows
{
public:
    IcoWindows();
    ~IcoWindows();

    virtual void paint();
    virtual void drawContents();

private:
    //  
};


class ButtonWindows :public Windows
{
public:
    ButtonWindows();
    ~ButtonWindows();


    virtual void paint();
    virtual void drawContents();

private:
    //

};

//windows.cpp 文件
#include "Windows.h"
#include "WindowsImp.h"
#include "WindowsFactory.h"

Windows::Windows()
:m_imp(NULL)
{

}


Windows::~Windows()
{
}

WindowsImp * Windows::getWindowImp()
{
    if (m_imp==NULL)
    {
        m_imp = WindowsFactory::Instance()->getMicWinImp();
    }
    return m_imp;
}


IcoWindows::IcoWindows()
{
}

IcoWindows::~IcoWindows()
{
}

void IcoWindows::paint()
{
    cout << "我是IcoWindows   paint()" << endl;
    //继承至父类,获取WindowsImp的实例
    this->getWindowImp()->deviceRect();
    return;
}

void IcoWindows::drawContents()
{
    cout << "我是IcoWindows   drawContents()" << endl;
    this->getWindowImp()->paintBitmap();
    return;
}


ButtonWindows::ButtonWindows()
{
}

ButtonWindows::~ButtonWindows()
{
}

void ButtonWindows::paint()
{
    cout << "我是ButtonWindows   paint()" << endl;
    this->getWindowImp()->deviceRect();
    return;
}

void ButtonWindows::drawContents()
{
    cout << "我是ButtonWindows   drawContents()" << endl;
    this->getWindowImp()->paintBitmap();
    return;
}


----------
//windowsImp.h 文件
#pragma once

#include <iostream>
using namespace std;

/*Windows 类的实现类 */
class WindowsImp
{
public:
    virtual ~WindowsImp();

    virtual void paintBitmap() = 0;
    virtual void deviceRect() = 0;

protected:
    WindowsImp();
};

//微软的版本  
class MicrosoftWindowsImp:public WindowsImp
{
public:
    MicrosoftWindowsImp();
    ~MicrosoftWindowsImp();

    virtual void paintBitmap();
    virtual void deviceRect();
private:

};

//苹果系统的版本  
class AppleWindowsImp:public WindowsImp
{
public:
    AppleWindowsImp();
    ~AppleWindowsImp();

    virtual void paintBitmap();
    virtual void deviceRect();
private:

};


//windowsImp.cpp 文件
#include "WindowsImp.h"


WindowsImp::WindowsImp()
{
}


WindowsImp::~WindowsImp()
{
}


MicrosoftWindowsImp::MicrosoftWindowsImp()
{
}

MicrosoftWindowsImp::~MicrosoftWindowsImp()
{
}

void MicrosoftWindowsImp::paintBitmap()
{
    cout << "微软windows系统的  paintBitmap()" << endl;
    return;
}

void MicrosoftWindowsImp::deviceRect()
{
    cout << "微软windows系统的  deviceRect()" << endl;
}


AppleWindowsImp::AppleWindowsImp()
{
}

AppleWindowsImp::~AppleWindowsImp()
{
}

void AppleWindowsImp::paintBitmap()
{
    cout << "苹果Mac系统的  paintBitmap()" << endl;
    return;
}

void AppleWindowsImp::deviceRect()
{
    cout << "苹果Mac系统的  deviceRect()" << endl;
    return;
}


----------
//WindowsFactory.h文件
#pragma once
#include <iostream>
using namespace std;

class WindowsImp;
class MicrosoftWindowsImp;
class AppleWindowsImp;

class WindowsFactory
{
public:
    WindowsFactory();
    ~WindowsFactory(); 
    //工厂方法 
    WindowsImp * getMicWinImp();   //创建微软windows版本的实例
    WindowsImp * getAppMacImp();   //创建苹果Mac版本的实例  

    /* 这里使用了 两个方法  来区分不同的系统版本对应的实现代码 */
    /* 也可以通过宏定义 使用一个工厂方法就可以 自动的对应实现的代码 */
    /* 也可以在创建Windows类的具体类的实例是 通过传入参数,来控制版本,总之方法很多  */

    //单例模式   
    static WindowsFactory * Instance();
private:
    static WindowsFactory *m_win;

    MicrosoftWindowsImp * m_micWin;
    AppleWindowsImp * m_appWin;
};


//WindowsFactory.cpp文件

#include "WindowsFactory.h"
#include "WindowsImp.h"

WindowsFactory::WindowsFactory()
:m_micWin(NULL), m_appWin(NULL)
{
}


WindowsFactory::~WindowsFactory()
{
}

WindowsImp * WindowsFactory::getMicWinImp()
{
    if (m_micWin==NULL)
    {
        m_micWin = new MicrosoftWindowsImp();
    }
    return m_micWin;
}

WindowsImp * WindowsFactory::getAppMacImp()
{
    if (m_appWin==NULL)
    {
        m_appWin = new AppleWindowsImp();
    }
    return m_appWin;
}

WindowsFactory * WindowsFactory::Instance()
{
    if (m_win == NULL)
    {
        m_win = new WindowsFactory();
    }
    return m_win;
}
WindowsFactory * WindowsFactory::m_win=NULL;


----------
//main.cpp文件

#include "Windows.h"
int main()
{
    IcoWindows ico;
    ico.drawContents();
    ico.paint();

    cout << "\n------------------------\n" << endl;

    ButtonWindows butt;
    butt.drawContents();
    butt.paint();

    getchar();
    return 0;
}

代码解析
  • windows类是 窗口控件的抽象类 IcoWindows 类和 ButtonWIndows 类是他的具体子类,代表两种不同的控件
  • windowsImp 类是 windows类的实现类 他的两个子类分别对应两个不同的实现版本
    使用 windowsImpFactory 类的工厂方法来实例化 windowsImp 的子类
    -windows类中的getWindowImp()方法来返回WindowsImp的实例
    windowsImpFactory 类使用了 单例模式

文件依赖图
这里写图片描述

效果

  • 分离了接口及其实现部分,降低编译的依赖性
  • 提高了可扩充性
  • 隐藏了实现细节

我的个人网站 http://www.breeziness.cn/
我的CSDN http://blog.csdn.net/qq_33775402

转载请注明出处 小风code www.breeziness.cn

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值