欢迎来到天天文库
浏览记录
ID:6646167
大小:175.50 KB
页数:10页
时间:2018-01-21
《[23种设计模式汇总]结构型模式_桥接模式》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、设计模式 桥接模式 概述在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就要使用Bridge模式。意图将抽象部分与实现部分分离,使它们都可以独立的变化。[GOF 《设计模式》]结构图图1Bridge模式结构图生活中的例子桥接模式将抽象部分与它的实现分离,使它们能够独立地变化。一个普通的开关控制的电灯、电风扇等等,都是桥接的例子。开关的目的是将设备打开或关闭。实
2、际的开关可以是简单的双刀拉链开关,也可以是调光开关。图2 使用电子开关例子的桥接对象图桥接模式解说在创建型模式里面,我曾经提到过抽象与实现,抽象不应该依赖于具体实现细节,实现细节应该依赖于抽象。看下面这幅图:图3 抽象不应该依赖于实现细节在这种情况下,如果抽象B稳定,而实现细节b变化,这时用创建型模式来解决没有问题。但是如果抽象B也不稳定,也是变化的,该如何解决?这就要用到Bridge模式了。我们仍然用日志记录工具这个例子来说明Bridge模式。现在我们要开发一个通用的日志记录工具,它支持数据库记录D
3、atabaseLog和文本文件记录FileLog两种方式,同时它既可以运行在.NET平台,也可以运行在Java平台上。根据我们的设计经验,应该把不同的日志记录方式分别作为单独的对象来对待,并为日志记录类抽象出一个基类Log出来,各种不同的日志记录方式都继承于该基类:图4Log类结构图实现代码如下:publicabstractclassLog{publicabstractvoidWrite(stringlog);}publicclassDatabaseLog:Log{publicoverridevoid
4、Write(stringlog){//......LogDatabase}}publicclassTextFileLog:Log{publicoverridevoidWrite(stringlog){//......LogTextFile}}另外考虑到不同平台的日志记录,对于操作数据库、写入文本文件所调用的方式可能是不一样的,为此对于不同的日志记录方式,我们需要提供各种不同平台上的实现,对上面的类做进一步的设计得到了下面的结构图:图5实现代码如下:publicclassNDatabaseLog:Dat
5、abaseLog{publicoverridevoidWrite(stringlog){//......(.NET平台)LogDatabase}}publicclassJDatabaseLog:DatabaseLog{publicoverridevoidWrite(stringlog){//......(Java平台)LogDatabase}}publicclassNTextFileLog:TextFileLog{publicoverridevoidWrite(stringlog){//......(
6、.NET平台)LogTextFile}}publicclassJTextFileLog:TextFileLog{publicoverridevoidWrite(stringlog){//......(Java平台)LogTextFile}}现在的这种设计方案本身是没有任何错误的,假如现在我们要引入一种新的xml文件的记录方式,则上面的类结构图会变成:图6如图中蓝色的部分所示,我们新增加了一个继承于Log基类的子类,而没有修改其它的子类,这样也符合了开放-封闭原则。如果我们引入一种新的平台,比如说我们现
7、在开发的日志记录工具还需要支持Borland平台,此时该类结构又变成了:图7同样我们没有修改任何的东西,只是增加了两个继承于DatabaseLog和TextFileLog的子类,这也符合了开放-封闭原则。但是我们说这样的设计是脆弱的,仔细分析就可以发现,它还是存在很多问题,首先它在遵循开放-封闭原则的同时,违背了类的单一职责原则,即一个类只有一个引起它变化的原因,而这里引起Log类变化的原因却有两个,即日志记录方式的变化和日志记录平台的变化;其次是重复代码会很多,不同的日志记录方式在不同的平台上也会有
8、一部分的代码是相同的;再次是类的结构过于复杂,继承关系太多,难于维护,最后最致命的一点是扩展性太差。上面我们分析的变化只是沿着某一个方向,如果变化沿着日志记录方式和不同的运行平台两个方向变化,我们会看到这个类的结构会迅速的变庞大。现在该是Bridge模式粉墨登场的时候了,我们需要解耦这两个方向的变化,把它们之间的强耦合关系改成弱联系。我们把日志记录方式和不同平台上的实现分别当作两个独立的部分来对待,对于日志记录方式,类结构图仍然是:图8现在我们引入另外一
此文档下载收益归作者所有