百度首页 | 百度空间
 
查看文章
 
2006-06-12 | 设计模式--桥接模式(Bridge Pattern)上
2006-07-13 13:27

概述

在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就要使用Bridge模式。

意图

将抽象部分与实现部分分离,使它们都可以独立的变化。[GOF 《设计模式》]

结构图

10c11c25b5a.jpg

1 Bridge模式结构图

生活中的例子

桥接模式将抽象部分与它的实现分离,使它们能够独立地变化。一个普通的开关控制的电灯、电风扇等等,都是桥接的例子。开关的目的是将设备打开或关闭。实际的开关可以是简单的双刀拉链开关,也可以是调光开关。

10cd11ab2c3.jpg

2 使用电子开关例子的桥接对象图

桥接模式解说

在创建型模式里面,我曾经提到过抽象与实现,抽象不应该依赖于具体实现细节,实现细节应该依赖于抽象。看下面这幅图:

10cd11b4617.jpg

3 抽象不应该依赖于实现细节

在这种情况下,如果抽象B稳定,而实现细节b变化,这时用创建型模式来解决没有问题。但是如果抽象B也不稳定,也是变化的,该如何解决?这就要用到Bridge模式了。

我们仍然用日志记录工具这个例子来说明Bridge模式。现在我们要开发一个通用的日志记录工具,它支持数据库记录DatabaseLog和文本文件记录FileLog两种方式,同时它既可以运行在.NET平台,也可以运行在Java平台上。

根据我们的设计经验,应该把不同的日志记录方式分别作为单独的对象来对待,并为日志记录类抽象出一个基类Log出来,各种不同的日志记录方式都继承于该基类:

10cd11bbdc5.jpg

4 Log类结构图

实现代码如下:

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)

{

//......Log Text File

}

}

另外考虑到不同平台的日志记录,对于操作数据库、写入文本文件所调用的方式可能是不一样的,为此对于不同的日志记录方式,我们需要提供各种不同平台上的实现,对上面的类做进一步的设计得到了下面的结构图:

10cd11c0dc7.jpg

5

实现代码如下:

public class NDatabaseLog : DatabaseLog

{

public override void Write(string log)

{

//......(.NET平台)Log Database

}

}

public class JDatabaseLog : DatabaseLog

{

public override void Write(string log)

{

//......(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

}

}

{未完,等续...}


类别:程序人生 | 添加到搜藏 | 浏览() | 评论 (0)
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码:
 

     

©2008 Baidu