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模式。
分享到:
相关推荐
所有模式都可分为类模式和对象模式两种,类模式是继承,对象模式是委托,而桥接模式和策略模式都是将任务委托给另外一个接口去实现,那么两者的区别什么呢?
Bridge 桥接模式(结构型模式)视频
桥接模式 桥接模式
桥接模式 C++ 实现
VMware 15虚拟机桥接模式无法上网问题 步骤 1:在设置中找到 网络和internet—>>更改适配器选项—–>>以太网 查看 共享网络给虚拟机(有些电脑不用) 步骤2:查看VMware虚拟网络编辑器的VMnet0桥接模式设置 ...
包含两篇文档:如何向妻子解释OOD和如何向妻子解释设计模式。 ——国外程序员通过对话方式浅显易懂的描述。关于设计模式原文仅更新了一个桥接模式,so 并不是23种都有,但对思想有一定帮助。
设计模式专题之(十)桥接模式---设计模式桥接模式示例代码(python--c++)
本篇文章主要介绍了VirtualBox配置虚拟网卡(桥接)——实现主机-虚拟机网络互通,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
设计模式 java 桥接模式
桥接模式的例子源码。这个源码因完成仓促,仅用来解释说明桥接模式含义,代码规范稍有欠缺,仅供参考。
图片浏览器的接口设计-桥接模式的运用 解决问题: 一个图像格式有两个基本的方面,一是结构,二是表象。其结构决定了图像是怎样存储的,而其表象决定了图像是怎样显示在屏幕上的。对于一个图像格式(BMP、JPG等)来...
利用桥接模式完成以下实例: 1、编辑与作者。出版社的编辑负责策划图书,并遴选作者完成图书的编著,然后根据图书的印张发布图书。作者负责完成图书的编著工作。 2、模拟毛笔:现需要提供大中小3种型号的画笔,...
免费提供个人设计模式简易代码,代码结构层次清晰,并且内含基本所有的注释,非常有利于初学者学习设计模式
C#面向对象设计模式纵横谈(8):Bridge 桥接模式(结构型模式) 体验课程
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段...
桥接模式和装饰模式,设计模式实验报告,BlueJ
设计模式 - 桥接模式
设计模式的桥接模式的例子,希望对大家有用
VMWare 6.0桥接模式虚拟机网络配置