代码改变世界

Bridge模式

2008-04-20 10:07  ubunoon  阅读(195)  评论(0编辑  收藏  举报

Bridge模式可以更方便的扩展,实现了类的实现与定义的完全分离。实现方式为:通过定义两个类,一个类来定义功能,另一个类来实现功能,实现功能的类的对象以参数形式赋给定义功能的类,从而实现信息相互配合使用。

本想在此处插入Bridge模式的UML图示,插入太麻烦,过几天修改插入!

下面是Bridge模式的一个实现例子:

   /// 抽象类定义

// window.h: interface for the window class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_WINDOW_H__879AA6CF_45FB_4EDD_BFF2_47275044D496__INCLUDED_)
#define AFX_WINDOW_H__879AA6CF_45FB_4EDD_BFF2_47275044D496__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class window  
{
public:
    
virtual void DrawRect(voidconst = 0;
    
virtual void DrawText(voidconst = 0;
    window();
    
virtual ~window();
}
;

#endif // !defined(AFX_WINDOW_H__879AA6CF_45FB_4EDD_BFF2_47275044D496__INCLUDED_)

/// 抽象类的类实现

// windowImp.h: interface for the windowImp class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_WINDOWIMP_H__D9031704_B384_45AC_BA53_89CC82FE50FB__INCLUDED_)
#define AFX_WINDOWIMP_H__D9031704_B384_45AC_BA53_89CC82FE50FB__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

// 为window类的实现,由于window类是abstract class,所以,windowImp 也为
// abstract class
// window 和windowImp之间的关系为Bridge关系
class windowImp  
{
public:
    
virtual void DrawRectImp(voidconst = 0;
    
virtual void DrawTextImp(voidconst =0;
    windowImp();
    
virtual ~windowImp();

}
;

#endif // !defined(AFX_WINDOWIMP_H__D9031704_B384_45AC_BA53_89CC82FE50FB__INCLUDED_)

从设计耦合的角度讲,在window类的初始化时就把windwoImp类粘贴进去,那是更为不错的设计,但是,这么设计,将会导致派生类中运用windowImp成为一个较为麻烦的事情,那样设计可以通过两种方式来管理内部数据:
1、将基类中的windowImp实例作为protected类型
2、把windowImp实例作为private类型,在基类中定义一个虚拟函数,用来获取windowImp实例,这种方式更加灵活一些

此处为求简便,未在window类的构造函数中载入windowImp的实例

///派生抽象类的定义,成为具体的类定义IconWindow

// IconWindow.h: interface for the IconWindow class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_ICONWINDOW_H__721CA32A_45BD_49B3_A72B_83D5987D96A5__INCLUDED_)
#define AFX_ICONWINDOW_H__721CA32A_45BD_49B3_A72B_83D5987D96A5__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include 
"window.h"
#include 
"windowImp.h"

class IconWindow : public window  
{
public:
    
virtual void DrawRect(voidconst;
    
virtual void DrawText(voidconst;
    IconWindow(windowImp
& wndImp);
    
virtual ~IconWindow();

private:
    windowImp
& m_wndImp;
}
;

#endif // !defined(AFX_ICONWINDOW_H__721CA32A_45BD_49B3_A72B_83D5987D96A5__INCLUDED_)

在派生类的构造函数中载入了windowImp的实例(引用方式载入)

/// 下面是 IconWindow 的实现

// IconWindow.cpp: implementation of the IconWindow class.
//
//////////////////////////////////////////////////////////////////////

#include 
"IconWindow.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

IconWindow::IconWindow(windowImp
& wndImp)
: m_wndImp(wndImp)
{

}


IconWindow::
~IconWindow()
{

}


void IconWindow::DrawText() const
{
    m_wndImp.DrawTextImp();   //通过windowImp来实现其功能
}


void IconWindow::DrawRect() const
{
    m_wndImp.DrawRectImp();   //通过windowImp来实现其功能

}

/// 下面是XWindow系统下的windowImp实现,首先进行类定义

// XWindowImp.h: interface for the XWindowImp class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_XWINDOWIMP_H__5CC6D589_DDA4_4CBC_B2C0_60A79AB64962__INCLUDED_)
#define AFX_XWINDOWIMP_H__5CC6D589_DDA4_4CBC_B2C0_60A79AB64962__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include 
"windowImp.h"

class XWindowImp : public windowImp  
{
public:
    
virtual void DrawTextImp(voidconst;
    
virtual void DrawRectImp(voidconst;
    XWindowImp();
    
virtual ~XWindowImp();

}
;

#endif // !defined(AFX_XWINDOWIMP_H__5CC6D589_DDA4_4CBC_B2C0_60A79AB64962__INCLUDED_)

/// 然后是XWindowImp的实现

// XWindowImp.cpp: implementation of the XWindowImp class.
//
//////////////////////////////////////////////////////////////////////

#include 
"XWindowImp.h"
#include 
<iostream>
using namespace std;

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

XWindowImp::XWindowImp()
{
    cout
<<"In XWindowImp class"<<endl;
}


XWindowImp::
~XWindowImp()
{
    cout
<<"quit XWindowImp class"<<endl;
}


void XWindowImp::DrawRectImp() const
{
    cout
<<"XWindowImp::DrawRectImp"<<endl;
}


void XWindowImp::DrawTextImp() const
{
    cout
<<"XWindowImp::DrawTextImp"<<endl;
}

为求简便,此处仅就实现这两个类的派生,下面进行测试:

#include "IconWindow.h"
#include 
"TranslentWindow.h"
#include 
"PMWindowImp.h"
#include 
"XWindowImp.h"
#include 
<iostream>
using namespace std;

void test(void)
{
    
// 测试XWindowImp中的性能,由于一般情况下,不同平台上不可能同时运行,
    
// 因此IconWindow以及TranslentWindow均需要重新定义
    XWindowImp xWndImp;
    IconWindow xIconWnd(xWndImp);
    xIconWnd.DrawText();
    xIconWnd.DrawRect();
//          在我的机器上,还有派生自window的TranslentWindow 的类定义与实现,也是通过调用
//          windowImp类引用的对象实现的。
//    TranslentWindow xTransWnd(xWndImp);
//    xTransWnd.DrawText();
//    xTransWnd.DrawRect();
    cout<<endl<<endl;

}


int main(void)
{
    test();
    
return 0;
}

小结:

       此处window类派生了IconWindow类,windowImp类派生了XWindowImp类。windowImp类是window类的实现,从两个派生类中接口函数的实现代码中可以看出,这也就是说window类是通过windowImp来实现,window类自己并没有实现接口功能的,而是通过windowImp类实现接口功能,这与单独一个类的申明与定义是类似的,因此window类可以作为类实现功能的申明,而windowImp类作为类实现功能的定义,这样就满足了接口与实现的完全分离,结合Decroator模式,window类的实现将会非常丰富,类与类之间的耦合程度也非常小,只有一个构造函数的耦合,同时也非常容易扩充,仅需要通过派生window类和windowImp类就可以实现新的window类功能与新的平台功能(此处)。