Bridge模式
2008-04-20 10:07 ubunoon 阅读(195) 评论(0) 编辑 收藏 举报Bridge模式可以更方便的扩展,实现了类的实现与定义的完全分离。实现方式为:通过定义两个类,一个类来定义功能,另一个类来实现功能,实现功能的类的对象以参数形式赋给定义功能的类,从而实现信息相互配合使用。
本想在此处插入Bridge模式的UML图示,插入太麻烦,过几天修改插入!
下面是Bridge模式的一个实现例子:
/// 抽象类定义
//
//////////////////////////////////////////////////////////////////////
#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(void) const = 0;
virtual void DrawText(void) const = 0;
window();
virtual ~window();
};
#endif // !defined(AFX_WINDOW_H__879AA6CF_45FB_4EDD_BFF2_47275044D496__INCLUDED_)
/// 抽象类的类实现
//
//////////////////////////////////////////////////////////////////////
#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(void) const = 0;
virtual void DrawTextImp(void) const =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
//
//////////////////////////////////////////////////////////////////////
#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(void) const;
virtual void DrawText(void) const;
IconWindow(windowImp& wndImp);
virtual ~IconWindow();
private:
windowImp& m_wndImp;
};
#endif // !defined(AFX_ICONWINDOW_H__721CA32A_45BD_49B3_A72B_83D5987D96A5__INCLUDED_)
在派生类的构造函数中载入了windowImp的实例(引用方式载入)
/// 下面是 IconWindow 的实现
//
//////////////////////////////////////////////////////////////////////
#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实现,首先进行类定义
//
//////////////////////////////////////////////////////////////////////
#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(void) const;
virtual void DrawRectImp(void) const;
XWindowImp();
virtual ~XWindowImp();
};
#endif // !defined(AFX_XWINDOWIMP_H__5CC6D589_DDA4_4CBC_B2C0_60A79AB64962__INCLUDED_)
/// 然后是XWindowImp的实现
//
//////////////////////////////////////////////////////////////////////
#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 "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类功能与新的平台功能(此处)。
*
* Copyright (c) 2011 Ubunoon.
* All rights reserved.
*
* email: netubu#gmail.com replace '#' to '@'
* http://www.cnblogs.com/ubunoon
* 欢迎来邮件定制各类验证码识别,条码识别,图像处理等软件
* 推荐不错的珍珠饰品,欢迎订购 * 宜臣珍珠(淡水好珍珠) */