文章目录
一、桥接模式的简介
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. 分析桥接模式设计思路
在介绍桥接模式的时候我说过桥接模式主要是为了将部分行为抽离出来,做到可以更加便捷的扩展维护。那么为了达到这个目的,桥接模式主要分为了四部分:
- 行为的定义接口 implementor
- 行为的实现类 concreteImplementor
- 产品抽象类 abstraction
- 抽象类实现类 refinedAbstraction
三、桥接模式的特点
1. 桥接模式的优缺点
优点:
- 将产品与行为分离,可以让系统在两个维护进行拓展,提高了系统的扩容性。
- 实现对业务透明,对产品隐藏,解耦合。
缺点:
- 增加了系统复杂度
- 要求识别系统的两个维度,对业务熟练度有要求
2. 桥接模式的使用场景
- 如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
- 对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
- 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
3. 桥接模式在JDK中的使用
JDBC相关类的设计就是使用了桥接模式,使用桥接模式的目的是为了可以为不同的数据库使用相同的拓展实现。
好了,今天的内容到此结束,如果还有疑问的同学可以私信我或在评论区留言,我会在第一时间为你解答。觉得有收获的小伙伴请记得一键三连,关注博主不要走丢,拒当白嫖党~