[设计模式] - 桥接模式

一、桥接模式的简介

1. 什么是桥接模式

桥接模式(Bridge) 又叫做柄体模式(handle and body),是结构性设计模式中的一种,他致力于将代码中抽象的部分与他的实现部分分离,达到他们都可以独立变化的目的。

2. 提出一个业务场景

今天的小王准备开一家富土康代工厂,准备为华为,小米,锤子代工生产手机。由于每种手机都是使用的安卓系统,因此同时具备安卓系统的相同特性,比如开机,关机,打电话。那么如果我们按照传统的思维实现代工厂要如何做呢?

3. 传统实现方式

我们先看下如果不适用桥接模式,我们需要如何实现这个业务。

(1) 创建Phone抽象类

public abstract class Phone {
	protected String brand;

	abstract void open();

	abstract void close();

	abstract void call();

}

(2) 创建具体手机品牌

由于子类实现相同,我这里就只贴出一个小米的代码

public class XiaomiPhone extends Phone {

	@Override
	void open() {
		System.out.println("小米手机开机了");

	}

	@Override
	void close() {
		System.out.println("小米手机关机了");

	}

	@Override
	void call() {
		System.out.println("小米手机可以拨打电话");

	}

}

(3) 编写测试类

public class Factory {

	public static void main(String[] args) {
		Phone phone = new XiaomiPhone();
		phone.call();
	}
}

在这里插入图片描述

4. 分析传统方式的优劣势

我们通过上述的例子可以发现,由于三种手机应用的都是安卓系统,所以操作行为大体相同。但是传统方式我们通过集成抽象类来实现这种复用业务每次都需要将重复的行为重新编码,造成了代码的冗余。第二就是如果这些功能的重复部分如果因为系统升级而造成了改变,那么我们就需要去每一个实现中修改相关方法的实现。那么为了解决这个问题,桥接模式就派上用场了。

二、桥接模式的实现

1. 改写既有代码

(1) 抽离共有行为

public interface AndroidImplementor {
	void open();

	void close();

	void call();

}

(2) 创建行为实现类

public class AndroidConcreteImplementor implements AndroidImplementor{

	@Override
	public void open() {
		System.out.println("手机开机了");
		
	}

	@Override
	public void close() {
		System.out.println("手机关机了");
		
	}

	@Override
	public void call() {
		System.out.println("拨打电话");
		
	}

}

(3) 创建实体抽象类

public abstract class PhoneAbstranction {

	protected AndroidImplementor androidImplementor;

	abstract void open();

	abstract void close();

	abstract void call();

	// 约束子类必须拥有有参构造
	public PhoneAbstranction(AndroidImplementor androidImplementor) {
		super();
		this.androidImplementor = androidImplementor;
	}

}

(4) 创建实体子类

public class XiaomiPhoneRefinedAbstraction extends PhoneAbstranction {

	public XiaomiPhoneRefinedAbstraction(AndroidImplementor androidImplementor) {
		super(androidImplementor);
	}

	@Override
	void open() {
		super.androidImplementor.open();

	}

	@Override
	void close() {
		super.androidImplementor.close();

	}

	@Override
	void call() {
		super.androidImplementor.call();

	}

}

(5) 测试

public class Factory {

	public static void main(String[] args) {
		PhoneAbstranction phone = new XiaomiPhoneRefinedAbstraction(new AndroidConcreteImplementor());
		phone.call();
	}
}

在这里插入图片描述

2. 分析桥接模式设计思路

在这里插入图片描述
在介绍桥接模式的时候我说过桥接模式主要是为了将部分行为抽离出来,做到可以更加便捷的扩展维护。那么为了达到这个目的,桥接模式主要分为了四部分:

  1. 行为的定义接口 implementor
  2. 行为的实现类 concreteImplementor
  3. 产品抽象类 abstraction
  4. 抽象类实现类 refinedAbstraction

三、桥接模式的特点

1. 桥接模式的优缺点

优点:

  1. 将产品与行为分离,可以让系统在两个维护进行拓展,提高了系统的扩容性。
  2. 实现对业务透明,对产品隐藏,解耦合。

缺点:

  1. 增加了系统复杂度
  2. 要求识别系统的两个维度,对业务熟练度有要求

2. 桥接模式的使用场景

  1. 如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
  2. 对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
  3. 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。

3. 桥接模式在JDK中的使用

JDBC相关类的设计就是使用了桥接模式,使用桥接模式的目的是为了可以为不同的数据库使用相同的拓展实现。

好了,今天的内容到此结束,如果还有疑问的同学可以私信我或在评论区留言,我会在第一时间为你解答。觉得有收获的小伙伴请记得一键三连,关注博主不要走丢,拒当白嫖党~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

晓龙oba

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

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

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

打赏作者

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

抵扣说明:

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

余额充值