Bridge-桥接_模式(精品)

上传人:沈*** 文档编号:244202942 上传时间:2024-10-03 格式:PPT 页数:31 大小:768KB
返回 下载 相关 举报
Bridge-桥接_模式(精品)_第1页
第1页 / 共31页
Bridge-桥接_模式(精品)_第2页
第2页 / 共31页
Bridge-桥接_模式(精品)_第3页
第3页 / 共31页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,Bridge-,桥接,主要内容,模式动机,模式定义,模式结构,模式的程序表示,C+,模式的程序表示,Java,实例与解析,模式效果评价,模式的适用环境,模式扩展,已知应用,模式小结,Bridge-,桥接:,动机,考虑在一个用户界面工具箱中,一个可移植的,Window,抽象部分的实现。假如采用继承机制有两个不足之处:,(,1,)扩展,Window,抽象使之适用于不同种类的窗口或新的系统平台很不方便。,(,2,)继承机制使得客户代码与平台相关。,1,Bridge-,桥接:,动机,Bridge,模式解决以上问题的方法是,将,Window,抽象和它的实现部分分别放在独立的类层次结构中。其中,一个类层次结构针对窗口接口(,Window,、,IconWindow,、,TransientWindow,),,另外一个独立的类层次结构针对平台相关的窗口实现部分,这个类层次结构的根类为,WindowImp,。,2,Bridge-,桥接,:,动机,1,2,Bridge-,桥接,:,动机,对于有,两个变化维度,(即两个变化的原因)的系统,采用,方案二,来进行设计系统中类的个数更少,且系统扩展更为方便。设计方案二即是桥接模式的应用。桥接模式,将继承关系转换为聚合关系,,从而,降低了类与类之间的耦合,,,减少了代码编写量,。,Bridge-,桥接,:,定义,桥接模式,(Bridge Pattern),:,将抽象部分与它的实现部分分离,使它们都可以独立地变化,。它是一种对象结构型模式,又称为柄体,(Handle and Body),模式或接口,(Interface),模式。,Bridge-,桥接,:,结构,Abstraction(Window,),定义抽象类的接口。,维护一个指向,Implementor,类型对象的指针。,RefinedAbstraction(IconWindow,),扩充由,Abstraction,定义的接口。,Bridge-,桥接,:,结构,Implementor(WindowImp,),定义实现类的接口,该接口不一定要与,Abstraction,的接口完全一致;事实上这两个接口可以完全不同。一般来讲,,Implementor,接口仅提供基本操作,而,Abstraction,则定义了基于这些基本操作的较高层次的操作。,ConcreteImplementor(XwindowImp,PMWindowImp,),实现,Implementor,接口并定义它的具体实现。,Bridge-,桥接,:,结构,理解桥接模式,重点需要理解如何将,抽象化,(Abstraction),与,实现化,(Implementation),脱耦,,使得二者可以独立地变化。,抽象化,:抽象化就是忽略一些信息,把不同的实体当作同样的实体对待。在面向对象中,,将对象的共同性质抽取出来形成类的过程,即为抽象化的过程。,实现化,:,针对抽象化给出的具体实现,就是实现化,,抽象化与实现化是一对互逆的概念,实现化产生的对象比抽象化更具体,是对抽象化事物的进一步具体化的产物。,脱耦,:脱耦就是,将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联,,,将两个角色之间的继承关系改为关联关系,。桥接模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用关联关系(组合或者聚合关系)而不是继承关系,从而使两者可以相对独立地变化,这就是桥接模式的用意。,Bridge-,桥接,:,程序表示,C+,class Window ,public:,Window(View,* contents);,/ requests handled by window,virtual void,DrawContents,();,virtual void Open();,virtual void Close();,virtual void,Iconify,();,virtual void,Deiconify,();,/ requests forwarded to implementation,virtual void,SetOrigin(const,Point,virtual void,SetExtent(const,Point,virtual void Raise();,virtual void Lower();,virtual void,DrawLine(const,Point,virtual void,DrawRect(const,Point,virtual void,DrawPolygon(const,Point,int,n);,virtual void,DrawText(const,char*, const Point,protected:,WindowImp,*,GetWindowImp,();,View*,GetView,();,private:,WindowImp,* _imp;,View* _contents; / the windows contents,;,class,WindowImp,public:,virtual void,ImpTop,() = 0;,virtual void,ImpBottom,() = 0;,virtual void,ImpSetExtent(const,Point,virtual void,ImpSetOrigin(const,Point,virtual void,DeviceRect(Coord,Coord,Coord,Coord,) = 0;,virtual void,DeviceText(const,char*,Coord,Coord,) = 0;,virtual void,DeviceBitmap(const,char*,Coord,Coord,) = 0;,/ lots more functions for drawing on windows.,protected:,WindowImp,();,;,void,Window:DrawRect,(const Point& p1, const Point& p2) ,WindowImp,* imp =,GetWindowImp,();,imp-DeviceRect(p1.X(), p1.Y(), p2.X(), p2.Y();,Bridge-,桥接,:,程序表示,C+,class,ApplicationWindow,: public Window ,public:,/ .,virtual void,DrawContents,();,;,void,ApplicationWindow:DrawContents,() ,GetView,()-,DrawOn(this,);,class,IconWindow,: public Window ,public:,/ .,virtual void,DrawContents,();,private:,const char* _,bitmapName,;,;,void,IconWindow:DrawContents,() ,WindowImp,* imp =,GetWindowImp,();,if (imp != 0) ,imp-,DeviceBitmap(_bitmapName, 0.0, 0.0);,Bridge-,桥接,:,程序表示,C+,class,XWindowImp,: public,WindowImp,public:,XWindowImp,();,virtual void,DeviceRect(Coord,Coord,Coord,Coord,);,/ remainder of public interface.,private:,/ lots of X window system-specific state, including:,Display* _,dpy,;,Drawable,_,winid,; / window id,GC _,gc,; / window graphic context,;,class,PMWindowImp,: public,WindowImp,public:,PMWindowImp,();,virtual void,DeviceRect(Coord,Coord,Coord,Coord,);,/ remainder of public interface.,private:,/ lots of PM window system-specific state, including:,HPS _,hps,;,;,void,XWindowImp:DeviceRect,(,Coord,x0,Coord,y0,Coord,x1,Coord,y1,) ,int,x = round(min(x0, x1);,int,y = round(min(y0, y1);,int,w = round(abs(x0 - x1);,int,h = round(abs(y0 - y1);,XDrawRectangle(_dpy, _,winid, _,gc, x, y, w, h);,void,PMWindowImp:DeviceRect,(,Coord,x0,Coord,y0,Coord,x1,Coord,y1) ,Coord,left = min(x0, x1);,Coord,right = max(x0, x1);,Coord,bottom = min(y0, y1);,Coord,top = max(y0, y1);,PPOINTL point4;,point0.x = left; point0.y = top;,point1.x = right; point1.y = top;,point2.x = right; point2.y = bottom;,point3.x = left; point3.y = bottom;,。,GpiStrokePath(_hps, 1L, 0L);,Bridge-,桥接,:,程序表示,C+,WindowImp,*,Window:GetWindowImp,() ,if (_imp = 0) ,_imp =,WindowSystemFactory:Instance,()-,MakeWindowImp,();,return _imp;,和工厂模式、单件模式的结合,Bridge-,桥接,:,程序表示,Java,典型的实现类接口代码:,public interface,Implementor,public void,operationImpl,();,Bridge-,桥接,:,程序表示,Java,典型的抽象类代码:,public abstract class Abstraction,protected,Implementor,impl,;,public void,setImpl(Implementor,impl,),this.impl,=,impl,;,public abstract void operation();,Bridge-,桥接,:,程序表示,Java,典型的扩充抽象类代码,public class,RefinedAbstraction,extends Abstraction,public void operation(),/,代码,impl.operationImpl,();,/,代码,Bridge-,桥接,:,实例与解析,实例一:模拟毛笔,现需要提供大中小,3,种型号的画笔,能够绘制,5,种不同颜色,如果使用蜡笔,我们需要准备,3*5=15,支蜡笔,也就是说必须准备,15,个具体的蜡笔类。而如果使用毛笔的话,只需要,3,种型号的毛笔,外加,5,个颜料盒,用,3+5=8,个类就可以实现,15,支蜡笔的功能。本实例使用桥接模式来模拟毛笔的使用过程。,Bridge-,桥接,:,实例与解析,实例一:模拟毛笔,Bridge-,桥接,:,实例与解析,实例二:跨平台视频播放器,如果需要开发一个跨平台视频播放器,可以在不同操作系统平台(如,Windows,、,Linux,、,Unix,等)上播放多种格式的视频文件,常见的视频格式包括,MPEG,、,RMVB,、,AVI,、,WMV,等。现使用桥接模式设计该播放器。,Bridge-,桥接,:,其它实例与解析,实例二:跨平台视频播放器,Bridge-,桥接,:,效果评价,模式优缺点,桥接模式的优点,分离抽象接口及其实现部分,。,桥接模式有时类似于多继承方案,但是多继承方案违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差,而且多继承结构中类的个数非常庞大,,桥接模式是比多继承方案更好的解决方法,。,桥接模式,提高了系统的可扩充性,,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。,实现细节对客户透明,可以对用户隐藏实现细节,。,Bridge-,桥接,:,效果评价,模式优缺点,桥接模式的缺点,桥接模式的引入会,增加系统的理解与设计难度,,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。,桥接模式要求正确识别出系统中两个独立变化的维度,因此,其使用范围具有一定的局限性,。,Bridge-,桥接,:,适用环境,如果一个系统,需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,,,避免在两个层次之间建立静态的继承联系,,通过桥接模式可以使它们在抽象层建立一个关联关系。,抽象化角色和实现化角色可以以继承的方式独立扩展而互不影响,,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。,一个类,存在两个独立变化的维度,,且这两个维度都需要进行扩展。,虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。,对于那些,不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,,桥接模式尤为适用。,Bridge-,桥接,:,模式扩展,适配器模式与桥接模式的联用,桥接模式和适配器模式用于设计的不同阶段,,桥接模式用于系统的初步设计,,对于存在两个独立变化维度的类可以将其分为抽象化和实现化两个角色,使它们可以分别进行变化;而在初步设计完成之后,,当发现系统与已有类无法协同工作时,可以采用适配器模式,。但有时候在设计初期也需要考虑适配器模式,特别是那些涉及到大量第三方应用接口的情况。,Bridge-,桥接,:,模式扩展,适配器模式与桥接模式的联用,Bridge-,桥接:,已知应用,(1) Java,语言通过,Java,虚拟机实现了平台的无关性。,Bridge-,桥接:,已知应用,(2),一个,Java,桌面软件总是带有所在操作系统的视感,(,LookAndFeel,),,如果一个,Java,软件是在,Unix,系统上开发的,那么开发人员看到的是,Motif,用户界面的视感;在,Windows,上面使用这个系统的用户看到的是,Windows,用户界面的视感;而一个在,Macintosh,上面使用的用户看到的则是,Macintosh,用户界面的视感,,Java,语言是通过所谓的,Peer,架构做到这一点的。,Java,为,AWT,中的每一个,GUI,构件都提供了一个,Peer,构件,,在,AWT,中的,Peer,架构就使用了桥接模式,。,Bridge-,桥接:,已知应用,模式应用,(3) JDBC,驱动程序也是桥接模式的应用之一。使用,JDBC,驱动程序的应用系统就是抽象角色,而所使用的数据库是实现角色。,一个,JDBC,驱动程序可以动态地将一个特定类型的数据库与一个,Java,应用程序绑定在一起,从而实现抽象角色与实现角色的动态耦合。,Bridge-,桥接:,模式小结,桥接模式将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体,(Handle and Body),模式或接口,(Interface),模式。,桥接模式包含如下四个角色:抽象类中定义了一个实现类接口类型的对象并可以维护该对象;扩充抽象类扩充由抽象类定义的接口,它实现了在抽象类中定义的抽象业务方法,在扩充抽象类中可以调用在实现类接口中定义的业务方法;实现类接口定义了实现类的接口,实现类接口仅提供基本操作,而抽象类定义的接口可能会做更多更复杂的操作;具体实现类实现了实现类接口并且具体实现它,在不同的具体实现类中提供基本操作的不同实现,在程序运行时,具体实现类对象将替换其父类对象,提供给客户端具体的业务操作方法。,在桥接模式中,抽象化,(Abstraction),与实现化,(Implementation),脱耦,它们可以沿着各自的维度独立变化。,Bridge-,桥接:,模式小结,桥接模式的主要优点是分离抽象接口及其实现部分,是比多继承方案更好的解决方法,桥接模式还提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统,实现细节对客户透明,可以对用户隐藏实现细节;其主要缺点是增加系统的理解与设计难度,且识别出系统中两个独立变化的维度并不是一件容易的事情。,桥接模式适用情况包括:需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系;抽象化角色和实现化角色可以以继承的方式独立扩展而互不影响;一个类存在两个独立变化的维度,且这两个维度都需要进行扩展;设计要求需要独立管理抽象化角色和具体化角色;不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统。,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!