最近的一次面试中,被问到桥接模式,以前呢并没有很仔细的研究过这个设计模式,借此机会剖析一下。
先给出自己对这个模式理解后的源码:
interface A{ void methodA(); } interface B{ void methodB(); } Class AImpl implements A{ Interface B; void methodA{ B.methodB(); } }
那么设个设计模式的应用场景呢?
从参考资料1中的解释是,调制解调器Modem,旧版OldModem采用的的dial和answer的模式,新版采用send和receive的模式。
整个模式的构建如下:
interface OldModem{ void dial(); void answer(); } interface NewModem{ void send(); void receive(); } //兼容OldModem的新Modem的实现 Class CapitableOldModemImpl implements OldModem{ NewModem newModem; CapitableOldModemImpl(NewModem param){ newModem = param; } void dial{ newModem.send(); } void answer{ newModem.receive(); } }
从这个可以看出来,OldModem自成一个体系,NewModem也是自成一个体系,那么以前的老产品继续继承自 OldModem就可以了,新的NewModem不想兼容OldModem那就直接集成NewModem就行了。
但是当新的Modem需要兼容老的OldModem的时候,这个时候就需要CapitableOldModemImpl这种形式了,讲两种抽象组合在一起。
那么有人就会说了,你这么设计的手段不就是组合两个接口吗,那么跟Adapter有什么区别?
从我自己的理解:Adapter模式是为了解决接口适配问题,更多的是对实现做变换。Bridge是为了将两种不同的抽象分离,达到独立变化的目的。 从我们的这个例子中我们可以看出来,就是为了解决新老接口的是适配问题。但是Aadpter是1:1的适配,这里的适配是两个大类型的适配,可以做到m:n适配。
参考文献:
【1】马丁
敏捷软件开发(原则模式与实践).P283(Bridge模式).