`
isiqi
  • 浏览: 16487469 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

设计模式中结构型模式(二)桥接模式(Bridge)

阅读更多

图示:

模式Bridge的结构与对象适配器类似,但是Bridge模式的出发点不同:Bridge目的是将接口
部分和实现部分分离,从而对它们可以较为容易也相对独立的加以改变。而Adapter则意味着
改变一个已有对象的接口。
以下一些情况使用Bridge模式:
1、你不希望在抽象和它的实现部分之间有一个固定的绑定关系。例如这种情况可能是因为,在
程序运行时刻实现部分应可以被选择或者切换。
2、类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这时Bridge模式使你可以对不同的抽象
接口和实现部分进行组合,并分别对它们进行扩充。
3、对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译。
4、C++中你想对客户完全隐藏抽象的实现部分。在C++中,类的表示在类接口中是可见的。

代码Application类与IconWindow为外部接口类,它们从BaseWindow继承,都有接口方法DrawContents(),但完成的任务不同,这里的不同体现在两点,一点是作为接口函数,可以实现不同的接口功能,另一点是可以调用不同的实现类来完成所要定制的功能。
从代码中看出,通过字符串的切换便可达到调用不同的实现类,完成不同的功能,而实现类无需任何的改变。同样,实现类的改变也同样不会影响这里的接口部分。
原书中(指的那本《设计模式》)所述用一个factory工厂类来完成类的定义,将自动找寻到子类并new出来这样的功能封装在factory中,可惜我按书中的方法始终没成功,因此稍做了一些变通,或许使得实现类与接口类有一点的耦合,以后有时间再仔细研究一下。

以下为示例代码

//Bridge.h:interfacefortheBridgeclass.
//
/**//**//**///////////////////////////////////////////////////////////////////////

#if!defined(AFX_BRIDGE_H__C037F529_E449_4786_8DEE_D8293BF666D5__INCLUDED_)
#defineAFX_BRIDGE_H__C037F529_E449_4786_8DEE_D8293BF666D5__INCLUDED_

#if_MSC_VER>1000
#pragmaonce
#endif//_MSC_VER>1000

#include
"BasicClass.h"
constMAX_PATH=250;
classView;
classWindowImp;

//Window的操作由WindowImp的接口定义。
//那么一个窗口怎样得到正确的WindowI子类的实例呢?在本例我们假设Window类具有
//职责,它的GetWindowImp操作负责从一个抽象工厂得到正确的实例,这个抽象工厂封
//装了所有窗口系统的细节。
classBaseWindow
...{
public:
BaseWindow()
...{_imp=0;}
voidSetClassName(constchar*classname);
constchar*GetClassNameA();


//requestshandledbywindow
virtualvoidDrawContents()...{};

virtualvoidOpen()...{}
protected:
WindowImp
*GetWindowImp();
private:
char_className[MAX_PATH];
WindowImp
*_imp;
}
;


//Window维护一个对WindowImp的引用,WindowImp抽象类定义了一个对底层窗口系统的接口
classWindowImp
...{
public:
virtualvoidDeviceRect(Coord,Coord,Coord,Coord)=0;
virtualvoidDeviceText(constchar*,Coord,Coord)=0;
virtualvoidDeviceBitmap(constchar*,Coord,Coord)=0;
//lotsmorefunctionsfordrawingonwindows
protected:
WindowImp()
...{}
}
;

//Window的子类定义了应用程序可能用到的不同类型蝗窗口,如应用窗口,图标,对话框临时
//窗口以及工具箱的移动面板等。
//例如ApplicationWindow类将实现DrawContents操作以绘制它所存储的View实例:
classApplicationWindow:publicBaseWindow
...{
public:
//
virtualvoidDrawContents();
}
;


//IconWindow中存储了它所显示的图标对应的位图名
//并且实现DrawContents操作将这个位图绘制在窗口上。
classIconWindow:publicBaseWindow
...{
public:
//
virtualvoidDrawContents();
private:
constchar*_bitmapName;
}
;


//具体的WindowImp子类可支持不同的窗口系统, XWindowImp子类支持XWindow窗口系统:
classXWindowImp:publicWindowImp
...{
public:
XWindowImp()
...{}

virtualvoidDeviceRect(Coord,Coord,Coord,Coord);
virtualvoidDeviceText(constchar*,Coord,Coord);
virtualvoidDeviceBitmap(constchar*,Coord,Coord);
//remainderofpublicinterface
private:
//lotsofXWindowsystem-specificstate,including:
//Display*_dpy;
//Drawable_winid;//windowid;
//GC_gc;//windowgraphiccontext
}
;

//对于PresentationManager(PM),
//我们定义PMWindowImp类
classPMWindowImp:publicWindowImp
...{
public:
PMWindowImp()
...{}
virtualvoidDeviceRect(Coord,Coord,Coord,Coord);
virtualvoidDeviceText(constchar*,Coord,Coord);
virtualvoidDeviceBitmap(constchar*,Coord,Coord);

//remainderofpublicinterface
private:
//lotsofPMwindowsystem-specificatate,including
//HPS_hps;
}
;


classWindowSystemFactory
...{
private:
staticWindowSystemFactory*_instance;
public:
staticWindowSystemFactory*Instance();
WindowImp
*MakeWindowImp(constchar*className);
}
;
#endif//!defined(AFX_BRIDGE_H__C037F529_E449_4786_8DEE_D8293BF666D5__INCLUDED_)






//Bridge.cpp:implementationoftheBridgeclass.
//
/**//**//**///////////////////////////////////////////////////////////////////////

#include
"stdafx.h"
#include
"Bridge.h"

#include
<string.h>
#include
<tchar.h>
#include
<wtypes.h>

#include
<string>
usingstd::string;

#definemax(a,b)(((a)>(b))?(a):(b))
#definemin(a,b)(((a)<(b))?(a):(b))
#defineabs(a)((a)<0)?(-(a)):(a)
/**//**//**///////////////////////////////////////////////////////////////////////
//Construction/Destruction
/**//**//**///////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////

//Construction/Destruction
/**//**//**///////////////////////////////////////////////////////////////////////

voidBaseWindow::SetClassName(constchar*classname)
...{
strcpy(_className,classname);
}


constchar*BaseWindow::GetClassNameA()
...{
return_className;
}


WindowImp
*BaseWindow::GetWindowImp()
...{
constchar*className=GetClassNameA();
if(_imp==0)
...{
_imp
=WindowSystemFactory::Instance()->MakeWindowImp(className);
}

return_imp;
}





voidApplicationWindow::DrawContents()
...{
SetClassName(_T(
"XWindowImp"));

WindowImp
*imp=GetWindowImp();
if(imp!=0)
...{
imp
->DeviceRect(0,0,0,0);
}

//GetView()->DrawOn(this);
}



voidIconWindow::DrawContents()
...{
SetClassName(_T(
"PMWindowImp"));
WindowImp
*imp=GetWindowImp();
if(imp!=0)
...{
imp
->DeviceBitmap(_bitmapName,0.0,0.0);
}

}


voidXWindowImp::DeviceRect(Coordx0,Coordy0,Coordx1,Coordy1)
...{
#pragmawarning(disable:4244)
intx=min(x0,x1);
inty=min(y0,y1);
intw=abs(x0-x1);
inth=abs(y0-y1);
printf(
"XWindowImp::DeviceRect ");

#pragmawarning(disable:4244)
//XDrawRectangele(_dpy,_winid,_gc,x,y,w,h);
}


voidXWindowImp::DeviceText(constchar*,Coord,Coord)
...{
printf(
"XWindowImp::Devicetext ");
}

voidXWindowImp::DeviceBitmap(constchar*,Coord,Coord)
...{
printf(
"XWindowImp::DeviceBitmap ");
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/E
分享到:
评论

相关推荐

    Bridge 桥接模式(结构型模式)

    桥接模式(Bridge Pattern)是一种结构型设计模式,它的主要目的是将抽象部分与实现部分分离,使得它们可以独立地进行变化。在软件工程中,这种分离有助于降低复杂性,提高代码的可维护性和可扩展性。桥接模式的核心...

    C#面向对象设计模式纵横谈(8):Bridge 桥接模式(结构型模式)

    桥接模式(Bridge Pattern)是面向对象设计中的一种结构型模式,它将抽象部分与实现部分分离,使得它们可以独立地进行变化。在C#编程中,桥接模式的应用能够帮助我们更好地解耦系统,提高代码的灵活性和可扩展性。 ...

    设计模式面面观(10):桥接模式(Bridge Pattern)-结构型模式

    创建型模式 (100%) 设计模式面面观(8):创建型模式总结 (100%) 设计模式面面观(9):适配器模式(Adapter Pattern)-结构型模式 (100%) 设计模式面面观(10):桥接模式(Bridge Pattern)-结构型模式 ...

    C#面向对象设计模式纵横谈(8):Bridge 桥接模式(结构型模式) (Level 300)

    桥接模式(Bridge Pattern)是一种结构型设计模式,它旨在将抽象部分与其实现部分分离,使得它们可以独立地进行变化。在C#编程中,这种模式尤其有用,因为随着软件系统的复杂性增加,类的继承层次可能会变得难以管理...

    c++设计模式-结构型模式-桥接模式

    c++设计模式-结构型模式-桥接模式;qt工程,c++简单源码; 桥接(Bridge)模式的定义如下:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度...

    设计模式之桥接模式BridgePattern

    桥接模式(Bridge Pattern)是设计模式中的一种结构型模式,它主要解决的是在软件设计中,当抽象和实现之间存在紧密耦合时,如何使这两者能够独立地变化。这种模式通过引入一个抽象层来分离接口和实现,使得它们可以...

    结构型模式之桥接模式(bridge)

    桥接模式是设计模式中的一种结构型模式,其主要目的是为了分离抽象部分和实现部分,以便两者能够独立地进行变化。这种模式的核心理念是通过引入一个抽象层来封装多种可能的实现,使得抽象和实现之间形成一种“桥接”...

    设计模式---桥接模式

    桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立进行变化。这种模式在软件工程中被广泛应用于处理组件之间的耦合问题,特别是当需要为同一抽象提供多种实现或者需要独立地改变它们时。 ...

    C#面向对象设计模式纵横谈\8 结构型模式Bridge桥接模式.zip

    在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要资源... 这是第8节:结构型模式Bridge桥接模式

    设计模式_结构型_桥接模式.md

    桥接模式(Bridge Pattern)是一种结构型设计模式,其主要目的是将抽象与实现解耦,使它们可以独立地进行变化。在软件设计中,我们经常会遇到需要将抽象概念和它的具体实现分离的场景,桥接模式正好可以解决这种问题...

    设计模式的桥接模式的例子

    桥接模式是设计模式中的一种结构型模式,它旨在将抽象部分与实现部分解耦,使得它们可以独立地变化。这种模式将抽象类和它的实现类进行分离,通过一个抽象接口来连接它们,使得两者可以独立发展,增加了系统的灵活性...

    设计模式之桥接模式

    桥接模式(Bridge Pattern)是设计模式中的一种结构型模式,它的主要目的是将抽象部分与实现部分解耦,使得它们可以独立地进行变化。在桥接模式中,抽象类与其具体的实现类通过一个抽象的“桥”进行连接,使得抽象...

    设计模式之桥接模式,内含可运行代码

    桥接模式是软件设计模式中的一种结构型模式,它的主要目的是为了实现抽象和实现的解耦,使得两者可以独立地进行扩展。在桥接模式中,抽象类(Abstraction)不直接引用具体实现(Implementation),而是通过一个桥接...

    c++-设计模式之桥接模式(Bridge Pattern)

    桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象部分与实现部分分离,使得两者可以独立地变化。这种模式常用于需要在多个维度上变化的场景,比如不同的形状和颜色,允许在不改变客户端代码的情况下增加新...

    BridgePattern 桥接设计模式示例

    桥接设计模式是一种结构型设计模式,它将抽象部分与其实现部分相分离,使得它们可以独立进行变化。在实际的软件开发中,这种模式能够帮助我们构建灵活、可扩展的系统,允许我们在不修改原有代码的情况下增加新的功能...

    设计模式 - 桥接模式(C++实例)

    桥接模式是一种结构型设计模式,它将抽象部分与其实现部分分离,使得它们可以独立地进行变化。在C++编程中,桥接模式能够帮助我们设计出更灵活、可扩展的系统,允许我们在不修改原有代码的基础上更换或增加新的实现...

    设计模式11桥接模式

    桥接模式(Bridge Pattern)是一种用于将抽象部分与其实现部分分离的设计模式,这样两者就可以独立变化。该模式属于对象结构型模式,有时也被称为柄体(Handle and Body)模式或接口(Interface)模式。 **英文定义...

Global site tag (gtag.js) - Google Analytics