桥接模式讲解及例子

上传人:鲁** 文档编号:487585351 上传时间:2024-01-01 格式:DOCX 页数:10 大小:11.99KB
返回 下载 相关 举报
桥接模式讲解及例子_第1页
第1页 / 共10页
桥接模式讲解及例子_第2页
第2页 / 共10页
桥接模式讲解及例子_第3页
第3页 / 共10页
桥接模式讲解及例子_第4页
第4页 / 共10页
桥接模式讲解及例子_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《桥接模式讲解及例子》由会员分享,可在线阅读,更多相关《桥接模式讲解及例子(10页珍藏版)》请在金锄头文库上搜索。

1、http:/ chen/archive/2007/05/21/1619498.aspx概述在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这 种“多维度”的变化?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外 的复杂度?这就是要使用Bridge模式。意图将抽象部分与实现部分分离,使它们都可以独立的变化。结构图图1Bridge模式结构图生活中的例子桥接模式将抽象部分与它的实现分离,使它们能够独立地变化。一个普通开关控制的电灯、 电风扇等等,都是桥接的例子。开关的目的是将设备打开或关闭。实际的开关可以是简单的 双刀拉链开关,也可以是调

2、光开关。图2使用电子开关例子的桥接对象图桥接模式解说在创建型模式里面,曾提到过抽象与实现,抽象不应该依赖于具体实现细节,实现细节应该 依赖于抽象。看下面这幅图:图3抽象不应该依赖于实现细节在这种情况下,如果抽象B稳定,而实现细节b变化,这时用创建型模式来解决没有问题。 但是如果抽象B也不稳定,也是变化的,该如何解决?这就要用到Bridge模式了。我们仍然用日志记录工具这个例子来说明Bridge模式。现在我们要开发一个通用的日志记 录工具,它支持数据库记录DatabaseLog和文本文件记录FileLog两种方式,同时它既可以运 行在.NET平台,也可以运行在Java平台上。根据我们的设计经验,

3、应该把不同的日志记录方式分别作为单独的对象来对待,并为日志记 录类抽象出一个基类Log出来,各种不同的日志记录方式都继承于该基类:图4Log类结构图实现代码如下:public abstract class Log.public abstract void Write(string log); public class DatabaseLog : Log.public override void Write(string log)./Log Database public class TextFileLog : Log.public override void Write(string log)

4、./Log Text File另外考虑到不同平台的日志记录,对于操作数据库、写入文本文件所调用的方式可能是不一 样的,为此对于不同的日志记录方式,我们需要提供各种不同平台上的实现,对上面的类做 进一步的设计得到了下面的结构图:实现代码如下:public class NDatabaseLog : DatabaseLog.public override void Write(string log)./(.NET 平台)Log Database public class JDatabaseLog : DatabaseLog.public override void Write(string log)

5、./(Java 平台)Log Database public class NTextFileLog : TextFileLog.public override void Write(string log)./.(.NET 平台)Log Text File public class JTextFileLog : TextFileLog.public override void Write(string log)./(Java 平台)Log TextFile现在的这种设计方案本身是没有任何错误的,假如现在我们要引入一种新的xml文件的记录 方式,则上面的类结构图会变成:如图中蓝色部分所示,我们新增

6、加了一个继承于Log基类的子类,而没有修改其它的子类, 这样也符合了开放-封闭原则。如果我们引入一种新的平台,比如说我们现在开发的日志记 录工具还需要支持Borland平台,此时该类结构又变成了:同样我们没有修改任何东西,只是增加了两个继承于DatabaseLog和TextFileLog的子类,这 也符合了开放-封闭原则。但是这样的设计是脆弱的,仔细分析就可以发现,它还是存在很多问题,首先它在遵循开放 -封闭原则的同时,违背了类的单一职责原则,集即一个类只有一个引起它变化的原因,而 这里引起Log类变化的原因却有两个,即日志记录方式的变化和日志记录平台的变化;其次 是重复代码会很多,不同的日志

7、记录方式在不同的平台上也会有一部分的代码是相同的;再 次是类的机构过于复杂,继承关系太多,难于维护;最后最致命的一点是扩展性太差。上面 我们分析的变化只是沿着某一个方向,如果变化沿着日志记录方式和不同的运行平台两个方 向变化,我们会看到这个类的结构会迅速变得庞大。现在该是Bridge模式粉墨登场的时候了,我们需要解耦这两个方面的变化,把它们之间的 强耦合关系改成弱联系。我们把日志记录方式和不同平台上的实现分别当作两个独立的部分 来对待,对于日志记录方式,类结构图仍然是:现在我们引入另外一个抽象类ImpLog,它是日志记录在不同平台上实现的基类,结构图如下:实现代码如下:using System

8、;using System.Collections.Generic;using System.Text;namespace BridgePattern./*/ / 功能:ImpLog 类/ 编写:Kalen_Chen/日期:2007年5月21日/ public abstract class ImpLog.public abstract void Execute(string msg);using System;using System.Collections.Generic;using System.Text;namespace BridgePattern./*/ / 功能:NImpLog 类

9、/ 编写:Kalen_Chen/日期:2007年5月21日/ public class NImpLog : ImpLog.public override void Execute(string msg).Console.WriteLine(.NET 平台:+ msg);using System;using System.Collections.Generic;using System.Text;namespace BridgePattern./*/ / 功能:JImpLog 类/ 编写:Kalen_Chen/日期:2007年5月21日/ public class JImpLog : ImpLo

10、g.public override void Execute(string msg).Console.WriteLine(Java 平台:+ msg);这时对于日志记录方式和不同的运行平台这两个类都可以独立的变化了,我们要做的工作就 是把这两部分之间连接起来。那如何连接呢?在这里,Bridge使用了对象组合的方式,类结 构如下:实现代码如下:using System;using System.Collections.Generic;using System.Text;namespace BridgePattern./*/ /功能:Log类/ 编写:Kalen_Chen/日期:2007年5月21

11、日/ public abstract class Log.protected ImpLog implementor;public ImpLog Implementor.set.implementor = value;public virtual void Write(string log).implementor.Execute(log);using System;using System.Collections.Generic;using System.Text;namespace BridgePattern./*/ / 功能:DatabaseLog类/ 编写:Kalen_Chen/日期:2

12、007年5月21日/ public class DatabaseLog :Log.public override void Write(string log).implementor.Execute(log);using System;using System.Collections.Generic;using System.Text;namespace BridgePattern./*/ / 功能:TextFileLog类/ 编写:Kalen_Chen/日期:2007年5月21日/ public class TextFileLog :Log.public override void Writ

13、e(string log).implementor.Execute(log);可以看到,通过对象组合的方式,Bridge模式把两个角色之间的继承关系改为了耦合的关系, 从而使这两者可以从容自若的各自独立的变化,这也是Bridge模式的本意。再来看一下客 户端如何去使用:using System;using System.Collections.Generic;using System.Text;namespace BridgePattern./*/ /功能:客户端调用/ 编写:Kalen_Chen/日期:2007年5月21日/ class Program.static void Main(string args)./.NET 平台下的 Database Log Log dblog = new DatabaseLog(); dblog.Implementor = new NImpLog();dblog.Write(DatabaseLog);/Java 平台下的 Text File Log Log txtlog = new TextFileLog(); txtlog.Implementor = new JImpLog();txtlog.Write(TextFileLog);Console.ReadLine();可能有人会担心说,这样不就又增加了客户程序与具体日志记录方式之间

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号