设计模式学习笔记--桥梁(Bridge)模式

2014-11-23 23:31:23 · 作者: · 浏览: 0


写在模式学习之前


什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式;每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案;当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式。

设计模式就是抽象出来的东西,它不是学出来的,是用出来的;或许你根本不知道任何模式,不考虑任何模式,却写着最优秀的代码,即使以“模式专家”的角度来看,都是最佳的设计,不得不说是“最佳的模式实践”,这是因为你积累了很多的实践经验,知道“在什么场合代码应该怎么写”,这本身就是设计模式。

有人说:“水平没到,学也白学,水平到了,无师自通”。诚然,模式背熟,依然可能写不出好代码,更别说设计出好框架;OOP理解及实践经验到达一定水平,同时也意味着总结了很多好的设计经验,但"无师自通",却也未必尽然,或者可以说,恰恰是在水平和经验的基础上,到了该系统的学习一下“模式”的时候了,学习一下专家总结的结果,印证一下自己的不足,对于提高水平还是很有帮助的。

本系列的设计模式学习笔记,实际是对于《Java与模式》这本书的学习记录。


桥梁模式的定义


桥梁模式的用意是“将抽象化(Abstraction)与实现化(Implementation)解耦,使得二者可以独立地变化”。

强关联和弱关联:

所谓强关联,就是在编译期已经确定的,无法在运行期动态改变的关联;所谓弱关联,就是可以动态地确定并且可以在运行期动态地改变的关联。

继承是强关联,而聚合关系是弱关联。

桥梁模式是为了解决“继承”灵活性不够的问题,提供了这样一种用聚合关系实现的弱耦合解决方案。

桥梁模式又称为柄体(Handle and Body)模式或接口(Interface)模式。


桥梁模式的结构


结构图


vcfJq9fps8m1xLPpz/O7r7XIvLa94bm5oaM8L3A+CjxwPqOoMqOp08nKtc/Wu6+9x8mrus3Bvbj2vt/M5cq1z9a7r73HyavL+dfps8m1xMq1z9a7r7XIvLa94bm5oaM8L3A+CjxwPjxicj4KPC9wPgo8aDI+y/nJ5rywtcS9x8mrPC9oMj4KPHA+PGJyPgo8L3A+CjxwPqOoMaOps+nP87uvo6hBYnN0cmFjdGlvbqOpvcfJq6O6s+nP87uvuPiz9rXEtqjS5aOssqKxo7Tm0ru49rbUyrXP1ruvttTP87XE0v3Tw6GjPC9wPgo8cD6jqDKjqdDe1f2z6c/zu6+jqFJlZmluZWQgQWJzdHJhY3Rpb26jqb3HyaujusCp1bmz6c/zu6+9x8mro6y4xLHkus3Q3tX9uLjA4LbUs+nP87uvtcS2qNLloaM8YnI+CjwvcD4KPHA+o6gzo6nKtc/Wu6+jqEltcGxlbWVudG9yo6m9x8mro7rV4rj2vcfJq7j4s/bKtc/Wu6+9x8mrtcS907/ao6y1q7K7uPiz9r7fzOW1xMq1z9aho7HY0OvWuLP2tcTKx6Os1eK49r3Tv9qyu9K7tqi6zbPpz/O7r73Hyau1xL3Tv9q2qNLlz+DNrKOsyrW8ysnPo6zV4sG9uPa907/av8nS1LfHs6Oyu9K70fmho8q1z9a7r73HyavTprjD1ru4+LP2tdey47LZ1/ejrLb4s+nP87uvvcfJq9OmuMPWu7j4s/a7+dPatdey47LZ1/e1xLj8uN/Su7LjtcSy2df3oaM8YnI+CjwvcD4KPHA+o6g0o6m+38zlyrXP1ruvo6hDb25jcmV0ZSBJbXBsZW1lbnRvcqOpvcfJq6O61eK49r3Hyau4+LP2yrXP1ruvvcfJq73Tv9q1xL7fzOXKtc/WoaM8YnI+CjwvcD4KPHA+s+nP87uvvcfJq77Nz/HKx9K7uPbLrrGttcTK1rH6o6y2+Mq1z9a7r73Hyau6zb7fzOXKtc/Wu6+9x8mrvs3P8crHy66xrbXEsa3J7aOs1eLSsr7Nyse0y8Sjyr2x8MP7obCx+szlobG1xMC01LShozwvcD4KPHA+PGJyPgo8L3A+CjxoMj60+sLryrXP1jwvaDI+CjxwPjxicj4KPC9wPgo8cD48L3A+CjxwcmUgY2xhc3M9"brush:java;">abstract class Abstraction { protected Implementor imp; public void operation() { imp.operationImp(); } } class RefinedAbstraction extends Abstraction { public void operation() { //improved logic } } abstract class Implementor { public abstract void operationImp(); } class ConcreteImplementorA extends Implementor { public void operationImp() { System.out.println("Do something..."); } }

对变化的封装


找到系统的可变因素,将之封装起来,通常就叫做“对变化的封装”。对编号的封装实际上是达到“开-闭”原则的途径,与组合/聚合复用原则是相辅相成的。

桥梁模式是“对变化的封装”原则以及组合/聚合复用原则的极好例子。


一个基于桥梁模式的重构


空中巴士(Airbus)、波音(Boeing)和麦道(McDonnell-Douglas)都是飞机制造商,他们都生产载客飞机(Passenger Plane)和载货飞机(Cargo Plane)。现在设计一个系统,描述这些飞机制造商以及它们所制造的飞机种类。两者类结构图如下。

不使用桥梁模式的结构图:\


使用桥梁模式后的结构图:\


使用场景


在以下的场景下应当使用桥梁模式:

(1)如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。

(2)设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。

(3)一个构件有多于一个的抽象化角色和实现化角色,系统需要它们之间进行动态耦合。

(4)虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。


结构模式(Structural Pattern)小结


结构模式(Structural Pattern)一共有七种,分别是:适配器模式、装饰模式、合成模式、代理模式、享元模式、门面模式、桥梁模式。

大致总结如下: