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

1. 简介

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

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

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

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

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

2. 类图

在这里插入图片描述

3. 代码实列

如下,根据简介中的场景,我们有一个饮品的实现接口类和一个抽象的杯子类,同时两个实体各自发展变化:

实现部分

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…

总结

  桥接模式的使用场景具有一定的局限性,具体表现在:

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

  当然使用桥接模式在一定程度上减少了抽象部分和实现部分的耦合,减少了因为单一继承导致的系统的耦合性较高。同时,它也造成了系统的理解性的复杂。我们需要根据一定的场景进行合理和灵活使用,其中也包括它与其它模式的结合使用,如与适配器模式的结合,这里就不做过多的解释了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
桥接模式是一种结构型设计模式,它的主要目的是将抽象部分与实现部分分离,使它们能够独立地变化。下面是一个Java桥接模式的示例: 首先定义一个抽象类Shape,它有一个DrawAPI的成员变量,表示它的实现。 ```java public abstract class Shape { protected DrawAPI drawAPI; protected Shape(DrawAPI drawAPI) { this.drawAPI = drawAPI; } public abstract void draw(); } ``` 然后定义具体的形状类,比如Circle和Rectangle,它们继承自抽象类Shape,并实现了draw方法。 ```java public class Circle extends Shape { private int x, y, radius; public Circle(int x, int y, int radius, DrawAPI drawAPI) { super(drawAPI); this.x = x; this.y = y; this.radius = radius; } @Override public void draw() { drawAPI.drawCircle(radius, x, y); } } public class Rectangle extends Shape { private int x, y, width, height; public Rectangle(int x, int y, int width, int height, DrawAPI drawAPI) { super(drawAPI); this.x = x; this.y = y; this.width = width; this.height = height; } @Override public void draw() { drawAPI.drawRectangle(x, y, width, height); } } ``` 最后定义一个DrawAPI接口,它有两个方法drawCircle和drawRectangle,表示画圆和画矩形的实现。 ```java public interface DrawAPI { void drawCircle(int radius, int x, int y); void drawRectangle(int x, int y, int width, int height); } ``` 现在,我们可以使用不同的DrawAPI实现来创建不同的Shape对象,比如: ```java DrawAPI redDrawAPI = new RedDrawAPI(); Shape redCircle = new Circle(100, 100, 10, redDrawAPI); redCircle.draw(); DrawAPI greenDrawAPI = new GreenDrawAPI(); Shape greenRectangle = new Rectangle(50, 50, 100, 200, greenDrawAPI); greenRectangle.draw(); ``` 这样就可以将形状的抽象部分和实现部分分离了。如果需要增加一种新的形状或者实现,只需要创建一个新的类实现Shape或者DrawAPI接口即可,不需要修改原有的代码。 完整的代码示例可以参考以下链接:https://github.com/iluwatar/java-design-patterns/tree/master/bridge

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

非正经程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值