设计模式学习笔记(八)——Bridge桥接模式

转载 2007年09月18日 15:37:00
设计模式学习笔记(八)——Bridge桥接模式

       Bridge桥接模式是一种结构型模式,它主要应对的是:由于类型的固有罗辑,使得类型具有两个或两个以上的纬度变化。也就是要求抽象不应依赖于实现细节,实现细节应依赖于抽象。

       《设计模式》中说到将抽象部分与实现部分分离,使他们可以独立的变化。

       举个例子更清楚些,好像我们平时玩的游戏中有PS版的,但是不是大家都有PS。这时我们等一段时间,一般会出PC版的或其他版本。由于支持游戏的平台不一样,但是如果我们编写的游戏程序为了适应另一种平台就要全部重新编写的话岂不是很麻烦。再加上游戏本身的变动,一句众人皆知的话:“死定了

       现在我们来看看Bridge桥接模式,看看它是如何解决类似问题的,首先我们看看Bridge模式的结构。


      
实际上,我们要做到的是把变化的部分提出,对其抽象,使变化独立。那我们如何做呢?通过组合的方式将变化独立出去。将一个事物中的多个纬度变化分离。

       下面举一个场景来理解一下,还是用汽车举例,我现在要一辆车(BMWBORA)在路(WaterRoadCement)上跑。现在有两个纬度的变化点:汽车和路。也就是上图中的AbstractChangePoint1AbstractChangePoint2AbstractChangePoint1中包含有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";

        }

  }

然后我们在客户代码中调用这些类,首先,我想要这个场景是BMWWaterRoad上跑,客户端代码如下:

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

如果我现在要一辆BORACement上跑,我们只要稍微修改一下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模式的要点:

       1Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的纬度来变化。

2、所谓抽象和实现沿着各自纬度的变化,即“子类化”它们,得到各个子类之后,便可以任意组合它们。

3Bridge模式有时候类似于多继承方案,但是多继承方案往往违背单一职责原则(即一个类只有一个变化的原因),复用性比较差。Bridge模式是比多继承方案更好的解决方法。

4Bridge模式的应用一般在“两个非常强的变化纬度”,有时候即使有两个变化的纬度,但是某个方向的变化纬度并不剧烈——换言之两个变化不会导致纵横交错的结果,并不一定要使用Bridge模式。 

我所理解的设计模式(C++实现)——桥模式(Bridge Pattern)

桥模式,其作用就是让抽象与实现相分离,让两者都能够各自变化。 举例来说吧,画图,我可以画矩形,圆,三角形等等,在哪里画呢?我可以在pdf上画,也可以在doc上面画。画什么图和在哪里画都是可以独立变化...
  • LCL_data
  • LCL_data
  • 2013年03月23日 16:11
  • 5261

C++设计模式实现--桥模式

一、概述:         在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化。那么为了应对这种“多维度的变化”(即两个以上变化的原因)的系统,可采用Bridge模式来进行设计,使系统...
  • cabinriver
  • cabinriver
  • 2013年05月14日 11:48
  • 3059

C++桥接模式详解--设计模式(7)

桥接模式的产生原因:          总结面向对象实际上就两句话:一是松耦合(Coupling),二是高内聚(Cohesion)。面向对象系统追求的目标就是尽可能地提高系统模块内部的内聚(Cohes...
  • fanyun_01
  • fanyun_01
  • 2016年06月27日 10:35
  • 1638

设计模式学习笔记十二:桥接模式(Bridge Pattern)

设计模式学习笔记十二:桥接模式(Bridge Pattern)     1.概述     桥接模式(Bridge),将抽象部分与它的实现部分分离,是他们都可以独立的变化。什么叫抽象与它的实现分...
  • AlbenXie
  • AlbenXie
  • 2017年08月11日 12:27
  • 151

设计模式学习笔记---桥接模式bridge(Java版)

一、场景 商场系统中常见的商品分类,例如电脑。 二、实质 处理多重继承结构,处理多维度变化的场景,将各个维度设计成独立的继承结构,使各个维度可以独立的扩展在抽象层建立关联。 三、示例 ...
  • scgaliguodong123_
  • scgaliguodong123_
  • 2015年03月03日 11:18
  • 553

十八、桥接模式——设计模式学习笔记

桥接模式,将抽象部分与它的实现部分分离,使它们都可以独立地变化。
  • L0nginus
  • L0nginus
  • 2017年07月01日 21:12
  • 155

(7)设计模式笔记[桥接模式Bridge]

桥是连接彼岸的,Bridge模式就是对两个类进行连接以便于从一个类调用另一个类的属性和方法这很容易让人想到Adapter模式,也是封装另一个类,以便调用但是这里略有不同:Adapter的被调用类是不可...
  • vatana
  • vatana
  • 2011年04月30日 09:46
  • 407

《设计模式解析》读书笔记之Bridge Pattern(桥接模式)

Bridge Pattern桥接模式 一Bridge Pattern简介 1 定义 2 Bridge Pattern通用结构 二Bridge Pattern关键特征 三代码 1 UML图 2 Clie...
  • qiwenmingshiwo
  • qiwenmingshiwo
  • 2016年08月02日 11:27
  • 581

设计模式(7)-结构型-桥接模式(Bridge)(个人笔记)

概述:将抽象部分与它的实现部分分离,使它们都可以独立地变化。适用性    1.你不希望在抽象和它的实现部分之间有一个固定的绑定关系。      例如这种情况可能是因为,在程序运行时刻实现部分应可以被选...
  • iihero
  • iihero
  • 2012年07月03日 20:52
  • 3543

设计模式笔记16:桥接模式(Bridge Pattern)

一、桥接模式的内容 桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(In...
  • yangzl2008
  • yangzl2008
  • 2012年06月17日 15:50
  • 3797
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式学习笔记(八)——Bridge桥接模式
举报原因:
原因补充:

(最多只允许输入30个字)