深入浅出理解桥接模式

4 篇文章 0 订阅
2 篇文章 0 订阅

在开始学java的时候老师讲到继承的时候,总是喜欢用一个例子来讲解,那就是画图,这里有一个画笔,可以画正方形、长方形、圆形(这个大家都知道怎么做吧,我就不解释了)。但是现在我们需要给这些形状进行上色,这里有三种颜色:白色、灰色、黑色。这里我们可以画出3*3=9中图形:白色正方形、白色长方形、白色圆形。。。。。。到这里了我们几乎到知道了这里存在两种解决方案:

  • 方案一:为每种形状都提供各种颜色的版本。
  • 方案二:根据实际需要对颜色和形状进行组合。

我们我们采用方案一来实现的话,我们是不是也可以这样来理解呢?为每种颜色都提供各种形状的版本呢?这个是完全的可以的。如下:

对于中两个图形,我们都会很清楚这样一个问题:加入我们添加椭圆,我们是不是又要增加三种颜色呢?假如我们在增加一个绿色,我们就要增加其四种形状了,继续加。继续加……每次增加都会增加若干个类(如果增加颜色则会增加形状个数个类,若增加形状则会增加颜色个数个类),这样的情况我想每个程序员都不会想要吧!那么我们看方案二。 方案二所提供的就是解决方法是:提供两个父类一个是颜色、一个形状,颜色父类和形状父类两个类都包含了相应的子类,然后根据需要对颜色和形状进行组合。

对于有几个变化的维度,我们一般采用方案二来实现,这样除了减少系统中的类个数,也利于系统扩展。对于方案二的应用我们称之为桥接模式。

一、 模式定义

桥接模式即将抽象部分与它的实现部分分离开来,使他们都可以独立变化。

桥接模式将继承关系转化成关联关系,它降低了类与类之间的耦合度,减少了系统中类的数量,也减少了代码量。

将抽象部分与他的实现部分分离这句话不是很好理解,其实这并不是将抽象类与他的派生类分离,而是抽象类和它的派生类用来实现自己的对象。这样还是不能理解的话。我们就先来认清什么是抽象化,什么是实现化,什么是脱耦。

抽象化:其概念是将复杂物体的一个或几个特性抽出去而只注意其他特性的行动或过程。在面向对象就是将对象共同的性质抽取出去而形成类的过程。

实现化:针对抽象化给出的具体实现。它和抽象化是一个互逆的过程,实现化是对抽象化事物的进一步具体化。

脱耦:脱耦就是将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联,将两个角色之间的继承关系改为关联关系。

对于那句话:将抽象部分与他的实现部分分离套用《大话设计模式》里面的就是实现系统可能有多个角度分类,每一种角度都可能变化,那么把这种多角度分类给分离出来让他们独立变化,减少他们之间耦合。

桥接模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用关联关系(组合或者聚合关系)而不是继承关系,从而使两者可以相对独立地变化,这就是桥接模式的用意。

二、 模式结构     

下图是桥接模式的UML结构图:

桥接模式主要包含如下几个角色:

  • Abstraction:抽象类。
  • RefinedAbstraction:扩充抽象类。
  • Implementor:实现类接口。
  • ConcreteImplementor:具体实现类 。 

三、 模式实现

模式场景我们就采用哪个画图的。其UML结构图如下:

首先是形状类:该类为一个抽象类,主要提供画形状的方法 Shape.java :

实例

public abstract class Shape { Color color; public void setColor(Color color) { this.color = color; } public abstract void draw(); }

然后是三个形状 。

圆形 Circle.java :

实例

public class Circle extends Shape{ public void draw() { color.bepaint("正方形"); } }

长方形 Rectangle.java :

实例

public class Rectangle extends Shape{ public void draw() { color.bepaint("长方形"); } }

正方形 Square.java :

实例

public class Square extends Shape{ public void draw() { color.bepaint("正方形"); } }

颜色接口 Color.java :

实例

public interface Color { public void bepaint(String shape); }

白色 White.java :

实例

public class White implements Color{ public void bepaint(String shape) { System.out.println("白色的" + shape); } }

灰色 Gray.java :

实例

public class Gray implements Color{ public void bepaint(String shape) { System.out.println("灰色的" + shape); } }

黑色 Black.java :

实例

public class Black implements Color{ public void bepaint(String shape) { System.out.println("黑色的" + shape); } }

客户端 Client.java :

实例

public class Client { public static void main(String[] args) { //白色 Color white = new White(); //正方形 Shape square = new Square(); //白色的正方形 square.setColor(white); square.draw(); //长方形 Shape rectange = new Rectangle(); rectange.setColor(white); rectange.draw(); } }

运行结果:

白色的正方形
白色的长方形

四、 模式优缺点

优点

  • 1、分离抽象接口及其实现部分。提高了比继承更好的解决方案。
  • 2、桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
  • 3、实现细节对客户透明,可以对用户隐藏实现细节。

缺点    

  •   1、桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
  • 2、桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。

五、 模式使用场景

  • 1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
  • 2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
  • 3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。

六、 模式总结

  • 1,桥接模式实现了抽象化与实现化的脱耦。他们两个互相独立,不会影响到对方。
  • 2,对于两个独立变化的维度,使用桥接模式再适合不过了。
  • 3,对于"具体的抽象类"所做的改变,是不会影响到客户。
  • 4,实际项目中,尽量使用合成/聚合,尽量不要使用类的继承。

Aggregation and Composition

1.Aggregation is one type of association between two objects describing the "have a" relationshp.while composition is a specific type of aggregation which implies ownership.

2.A composition defines a part-of a relationship, and both the entities are connected to each other.you can find another from either one. but Aggration is a single direction relationship, which means you just find A through B,but cant in reverse.

3.in an aggregation relationship, objects that are associated with each other can remain in the scope of a system without each other.but in a composition relationship,objects that are associated with each other can not remain in the scope without each other.

4. In aggregation, linked objects are not dependent upon the other object,whereas in composition, objects are highly dependent upon each other.

5. In Aggregation, deleting a single element does not affect another associated element, on the contray, in composition deleting a single element affects another associated element.

基于以上分析,聚合(Aggregation)一般通过指针来实现,而组合一般通过对象包含的方式来实现。

比如,LINUX系统中大量使用的嵌入到其它对象中的双向链表对象 struct list_head,就是组合关系,你可以通过任何一方找到另一方,两个都是对象实体。

但是结构体中的private_data指针却是聚合关系,以strut file->private_data为例,你可以从stuct file找到private_data字段,但是却无法通过private_data字段找到struct file.

桥接模式和适配器模式的区别和联系:

从意图上看:

适配器是为了复用已有接口的功能,而通过适配将已有接口功能引入到所需接口的一种模式,目的是能够结合。

桥接模式是为了实现两个接口结合的多样化而设计的一种模式,目的是结合的更好。
从实现上看:
适配器是先定义了新接口,然后才与旧接口进行适配,即先接口后关系。
桥接模式是先定义了一个桥(即两个接口之间的关系),然后通过每个接口的多个实现的不同组合达到其灵活性的目的,即先关系后组合。

Linux内核的设计用到了哪些设计模式?


以观察者模式为例,通用框架如下:

Linux内核中断框架使用观察者模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,具体到内核的中断处理框架,则是下图这个样子,驱动定义的中断函数作为观察者,而中断管理框架作为通知者的身份.

桥接模式和适配器模式的异同点:

总结
总体来看类似于递进的过程(并不完全,为了便于理解,只是比喻),适配器将两个接口结合在一起,然后桥接使他们的结合更加多样化。

UML一一 类图关系 (泛化、实现、依赖、关联、聚合、组合)_uml类图关系_white camel的博客-CSDN博客

结束!

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值