设计模式之桥接模式

  桥接模式属于结构型设计模式,它通过提供抽象化和实现化之间的桥接结构来实现二者的解耦。

  定义:将抽象和实现解耦,使两者可以独立变化。

  问题描述:在软件系统中,某些类由于自身的逻辑,它具有两个或多个维度的变化,其中一个发生变化会导致整个类发生变化,那么我们该如何应对这种“多维度的变化”,让该类型能够轻松地沿着多个方向进行变化,又不引入额外的复杂度呢?

  解决方案:适用桥接模式,将这两个或多个维度分离出来,使两者可以独立扩展。

  结构图

  举个栗子:将一个关于蜡笔的故事。。。

  我们现有大中小3三种型号的蜡笔,每种型号的蜡笔均能绘制12种不同的颜色,那么如果现在要增加一种新型号的蜡笔,并且也需要具有12种颜色,也就是增加了12支蜡笔,如此颜色和型号两个不同的变化维度融合在一起,无论是对颜色进行扩展还是对型号进行扩展都势必会影响到另一个维度,这样在蜡笔中颜色和型号之间存在较强的耦合,那么桥接模式就是来对颜色和型号进行解耦的。具体实现方式如下:

  1. 新增一个实现了接口ColorImp的颜色类RedColor,YellowColor和BlueColor。代码如下:

         

         

  YellowColor和BlueColor类似,此处省略。

  2. 新增一个实现了接口ModelImp的型号类BigModel、MiddleModel和SmallModel。代码如下:

         

         

  BigModel和SmallModel类似,此处省略。

  3. 新增一个抽象类PenAbstraction,定义该抽象类的行为(指定蜡笔的类型和颜色),并保存对实例化角色的引用,分别声明ModelImp接口和ColorImp接口的对象。代码如下:

         

  4. 新增一个具体实现类Crayon,继承上面的抽象类PenAbstraction,实现在PenAbstraction中声明的抽象业务方法。代码如下:

         

  5. 在类BridgeFragment中通过类Crayon的实例化对象来实现功能。代码如下:

  

  6. 运行后的效果,如图所示:

      

  综上所述,类型和颜色是蜡笔中两个独立变化的维度,我给这两个维度都提供了抽象层,并在抽象部分PenAbstraction建立抽象耦合,这样就将抽象部分和它的实现部分分离了,类型和颜色可以独立地变化,客户端可以随意替换或增加类型和颜色,两者之间互不影响,且不用修改原有的结构。

  优点:分离抽象接口及其实现部分,实现解耦;提高了可扩展性,可以任意扩展其中一个维度,不需要修改原有系统,符合开闭原则。

  缺点:正确识别系统中独立变化的维度的时候存在一定的难度,并且增加系统的理解与设计难度。

  适用场景

  1. 一个类存在两个或者多个独立变化的维度,且这两个或多个维度都需要独立进行扩展的时候;

  2. 需要在抽象化和具体化之间增加更多的灵活性,避免它们之间建立静态的继承关系的时候;

  3. 需要对抽象化角色和实现话角色进行动态耦合的时候;

  3. 不希望使用继承或多继承导致系统类的个数急剧增加的时候。

原文地址:https://www.cnblogs.com/chenxkang/p/6734706.html