设计模式(java)-桥接模式

1. 简介

  桥接模式,引用百度百科的解释以下:java

桥接模式是将抽象部分与它的实现部分分离,使它们均可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interfce)模式。web

  由上能够看出来,它存在两个维度的对象:抽象部分和实现部分。那么什么是抽象部分,什么是实现部分呢。ide

实现部分:通常的,它存在于抽象部分,继承于统一个接口的实例。
抽象部分:对实现部分的接口方法进行具体逻辑使用,以达到需求的最终目的,它是对实现的具体抽象和包装。svg

  以上,解释的有点抽象,下面会以具体场景进行说明。例如:一家饮品店,有多种饮品,饮品又分为大杯、中杯、小杯。那么从这个场景中,咱们会发现:饮品的种类是会发生变化的,那么杯子的型号发生变化吗?答案是会的,为了一些营销策略,老板可能去掉了小杯的型号,改成:中杯、大杯、特大杯。(是否是想到了罗永浩再星巴克抽本身脸的小短片了?)。那么,这两个模块均可以独自的变化,彼此又有一种联系:杯子里须要装饮品。若是不使用桥接模式的化,单单是继承的方式构建类,那么会出现m*n个类的状况,且每增长一种类型,类的个数会成倍的增长。因此这里能否让其各自变化,将包装饮品的抽象化与作饮品的实现化进行分离,这样就只会有m+n个类,而咱们只须要经过一个相似桥的方式将二者联系起来,使的实现部分实现客户的具体需求。ui

2. 类图

在这里插入图片描述

3. 代码实列

以下,根据简介中的场景,咱们有一个饮品的实现接口类和一个抽象的杯子类,同时两个实体各自发展变化: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

  1. 当一个类须要两个独立变化的维度,且两个维度会根据需求的变化进行扩展。
  2. 当一个场景下,类的扩展速度以m*n的方式进行的时候,为了减小类的膨胀,可使用桥接模式,将其减小到m+n。

  固然使用桥接模式在必定程度上减小了抽象部分和实现部分的耦合,减小了由于单一继承致使的系统的耦合性较高。同时,它也形成了系统的理解性的复杂。咱们须要根据必定的场景进行合理和灵活使用,其中也包括它与其它模式的结合使用,如与适配器模式的结合,这里就不作过多的解释了。xml