Bridge桥接模式是一种结构型模式,它主要应对的是:由于类型的固有罗辑,使得类型具有两个或两个以上的纬度变化。也就是要求抽象不应依赖于实现细节,实现细节应依赖于抽象。
《设计模式》中说到将抽象部分与实现部分分离,使他们可以独立的变化。
举个例子更清楚些,好像我们平时玩的游戏中有PS版的,但是不是大家都有PS。这时我们等一段时间,一般会出PC版的或其他版本。由于支持游戏的平台不一样,但是如果我们编写的游戏程序为了适应另一种平台就要全部重新编写的话岂不是很麻烦。再加上游戏本身的变动,一句众人皆知的话:“死定了”。
现在我们来看看Bridge桥接模式,看看它是如何解决类似问题的,首先我们看看Bridge模式的结构。
实际上,我们要做到的是把变化的部分提出,对其抽象,使变化独立。那我们如何做呢?通过组合的方式将变化独立出去。将一个事物中的多个纬度变化分离。
下面举一个场景来理解一下,还是用汽车举例,我现在要一辆车(BMW或BORA)在路(WaterRoad或Cement)上跑。现在有两个纬度的变化点:汽车和路。也就是上图中的AbstractChangePoint1和AbstractChangePoint2。AbstractChangePoint1中包含有AbstractChangePoint2对象成员。。代码实现如下:
abstract class AbstractCar
{
public AbstractRoad road;
public AbstractCar(AbstractRoad road)
{
this.road = road;
}
public abstract string Run();
public abstract string Stop();
}
abstract class AbstractRoad
{
public abstract string GetRoadType();
}
以汽车为变化中心,用组装的方式将两个变化点结合起来。使路的变化和汽车隔离。下面来编写路的实现。
class WaterRoad:AbstractRoad
{
public override string GetRoadType()
{
return "It is WaterRoad";
}
}
class CementRoad:AbstractRoad
{
public override string GetRoadType()
{
return "It is Cement";
}
}
然后再来编写汽车的实现
class BMWCar:AbstractCar
{
public BMWCar(AbstractRoad road)
: base(road)
{
}
public override string Run()
{
return "BMW is running";
}
public override string Stop()
{
return "BMW is stopped";
}
}
class BROACar:AbstractCar
{
public BROACar(AbstractRoad road)
: base(road)
{
}
public override string Run()
{
return "BROA is running";
}
public override string Stop()
{
return "BROA is stopped";
}
}
然后我们在客户代码中调用这些类,首先,我想要这个场景是BMW在WaterRoad上跑,客户端代码如下:
static void Main(string[] args)
{
AbstractCar car = new BMWCar(new WaterRoad());
Console.WriteLine(car.road.GetRoadType());
Console.WriteLine(car.Run());
Console.WriteLine(car.Stop());
Console.Read();
}
实现结果如下:
It is WaterRoad
BMW is running
BMW is stopped
如果我现在要一辆BORA在Cement上跑,我们只要稍微修改一下car的实例化就可以,代码如下:
static void Main(string[] args)
{
AbstractCar car = new BROACar(new CementRoad());
Console.WriteLine(car.road.GetRoadType());
Console.WriteLine(car.Run());
Console.WriteLine(car.Stop());
Console.Read();
}
实现结果如下:
It is Cement
BROA is running
BROA is stopped
最后我们再来说说Bridge模式的要点:
1、Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的纬度来变化。
2、所谓抽象和实现沿着各自纬度的变化,即“子类化”它们,得到各个子类之后,便可以任意组合它们。
3、Bridge模式有时候类似于多继承方案,但是多继承方案往往违背单一职责原则(即一个类只有一个变化的原因),复用性比较差。Bridge模式是比多继承方案更好的解决方法。
4、Bridge模式的应用一般在“两个非常强的变化纬度”,有时候即使有两个变化的纬度,但是某个方向的变化纬度并不剧烈——换言之两个变化不会导致纵横交错的结果,并不一定要使用Bridge模式。
相关推荐
桥梁模式你值得拥有,简单实用易上手,不能错过的实例。
设计模式C++学习之桥梁模式(Bridge)
设计模式之桥梁模式的Java版本实现和UML类图
C++设计模式课件7_桥模式.pdf
java实现桥梁模式
C++设计模式代码资源7_桥模式.zip
桥模式(Qt平台)
桥梁模式是对象的结构模式。又称为柄体(Handle and Body)模式或接口(Interface)模式。桥梁模式的用意是“将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化”。
SCALANCE W 桥模式使用指南zip,SCALANCE W 桥模式使用指南
一、桥梁模式结构图 二、桥梁模式中主要角色 抽象化(Abstraction)角色:定义抽象类的接口并保存一个对实现化对象的引用。 修正抽象化(Refined Abstraction)角色:扩展抽象化角色,改变和修正父类对抽象化的定义...
西门子SCALANCE W桥模式使用指南zip,西门子SCALANCE W桥模式使用指南: 本文描述了SCALANCE W模块中的一些桥功能,例如VLAN和生成树协议。并阐述了桥功能协议的基本原理。而且通过一些具体的配置实例说明了使用这些...
本文实例讲述了JavaScript设计模式–桥梁模式引入操作。分享给大家供大家参考,具体如下: 1.使用情况 (1)事件的监控 #1,利用页面的button来选择宠物的例子(思路) button.addEvent(element,"click",...
桥梁模式的结构与示意性源代码.doc
GOF中桥梁模式的java实现,及说明.pdf
基于LINUX下桥模式的入侵检测系统的研究.pdf
行业资料-交通装置-一种基于桥模式的数据库审计方法.zip
SANGFOR_WOC_v9.1_双网桥模式部署配置指导书.pdf.pdf
桥模式:将对摸个问题抽象的不同形式分别于该问题的具体实现部分相互分离,是它们都可以独立的裱花,并且能动态的结合。这个模式是面向对象的接口隔离原则的典型实现和具体的应用。使用桥模式可以讲对问题的抽象的...
主要介绍了Java设计模式之桥模式(Bridge模式)介绍,本文讲解了为什么使用桥模式、如何实现桥模式、Bridge模式在EJB中的应用等内容,需要的朋友可以参考下