桥接模式,引用百度百科的解释以下:java
桥接模式是将抽象部分与它的实现部分分离,使它们均可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interfce)模式。web
由上能够看出来,它存在两个维度的对象:抽象部分和实现部分。那么什么是抽象部分,什么是实现部分呢。ide
实现部分:通常的,它存在于抽象部分,继承于统一个接口的实例。
抽象部分:对实现部分的接口方法进行具体逻辑使用,以达到需求的最终目的,它是对实现的具体抽象和包装。svg
以上,解释的有点抽象,下面会以具体场景进行说明。例如:一家饮品店,有多种饮品,饮品又分为大杯、中杯、小杯。那么从这个场景中,咱们会发现:饮品的种类是会发生变化的,那么杯子的型号发生变化吗?答案是会的,为了一些营销策略,老板可能去掉了小杯的型号,改成:中杯、大杯、特大杯。(是否是想到了罗永浩再星巴克抽本身脸的小短片了?)。那么,这两个模块均可以独自的变化,彼此又有一种联系:杯子里须要装饮品。若是不使用桥接模式的化,单单是继承的方式构建类,那么会出现m*n个类的状况,且每增长一种类型,类的个数会成倍的增长。因此这里能否让其各自变化,将包装饮品的抽象化与作饮品的实现化进行分离,这样就只会有m+n个类,而咱们只须要经过一个相似桥的方式将二者联系起来,使的实现部分实现客户的具体需求。ui
以下,根据简介中的场景,咱们有一个饮品的实现接口类和一个抽象的杯子类,同时两个实体各自发展变化:this
interface IDrink { public void doDrink(); } class ECoffe implements IDrink { @Override public void doDrink() { //do coffe ... System.out.print("Coffee is done!"); } } class EFruitTea implements IDrink { @Override public void doDrink() { // do fruit tea System.out.print("fruit is done!"); } } class EMilk implements IDrink { @Override public void doDrink() { // do milk System.out.print("milk is done!"); } }
abstract class ECup { protected IDrink drink; public void setDrink(IDrink drink) { this.drink = drink; } public abstract void doWrap(); } class ESmallCup extends ECup { @Override public void doWrap() { // small cup this.drink.doDrink(); System.out.println(" Packing a small cup..."); } } class EMediumCup extends ECup { @Override public void doWrap() { // small cup this.drink.doDrink(); System.out.println(" Packing a medium cup..."); } } class EBigCup extends ECup { @Override public void doWrap() { // small cup this.drink.doDrink(); System.out.println(" Packing a big cup..."); } }
public static void main(String[] args) { ECup smallCup = new ESmallCup(); IDrink coffe = new ECoffe(); smallCup.setDrink(coffe); smallCup.doWrap(); ECup bigCup = new EBigCup(); IDrink milk = new EMilk(); bigCup.setDrink(milk); bigCup.doWrap(); }
Coffee is done! Packing a small cup…
milk is done! Packing a big cup…spa
桥接模式的使用场景具备必定的局限性,具体表如今:code
- 当一个类须要两个独立变化的维度,且两个维度会根据需求的变化进行扩展。
- 当一个场景下,类的扩展速度以m*n的方式进行的时候,为了减小类的膨胀,可使用桥接模式,将其减小到m+n。
固然使用桥接模式在必定程度上减小了抽象部分和实现部分的耦合,减小了由于单一继承致使的系统的耦合性较高。同时,它也形成了系统的理解性的复杂。咱们须要根据必定的场景进行合理和灵活使用,其中也包括它与其它模式的结合使用,如与适配器模式的结合,这里就不作过多的解释了。xml