基本介绍
桥接模式(Bridge)是指:将实现与抽象放在两个不同的层次中,使两个层次可以独立改变。是一种结构型设计模式。Bridge模式是基于类的最小设计原则,通过使用封装、聚合、继承等行为让不同的类承担不同的职责,它的主要特点是把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各个部分的独立性以及对应他们的功能扩展。
原理简要类图
原理类图简要说明
1、Client桥接模式的调用者
2、抽象类(Abstraction) 维护 Implementor 即它的实现子类ConcreteImplementorA/B… 二者是聚合的关系Abstraction充当了桥接类。抽象类和接口是聚合的关系,也是调用与被调用的关系。
3、RefinedAbstraction是抽象类(Abstraction) 的子类。
4、Implementor 行为实现类的接口。
5、ConcreteImplementorA/B 行为的具体实现类。
桥接模式代码示例
需求说明:有各种品牌、各种样式的手机,实现打电话、开机、关机等功能
根据桥接模式的原理类图,设计符合需求的实际类图
主要思路是两个继承树分开,功能继承树只实现功能,手机品牌继承树只关心不同品牌、类型的手机。功能聚合到 Phone 中即可。
package com.example.pattern.bridge;
/**
* 桥接模式
*/
interface Function { // 功能接口
default void open() {
System.out.println("开机");
}
default void close() {
System.out.println("关机");
}
default void call() {
System.out.println("打电话");
}
void internet();
}
class FourGFunction implements Function { // 功能的具体实现
@Override
public void internet() {
System.out.println("使用 4G 上网");
}
}
class FiveGFunction implements Function {
@Override
public void internet() {
System.out.println("使用 5G 上网");
}
}
public abstract class Phone { // 抽象类 用于桥接 具体手机 与 功能
public Function function;
public Phone(Function function) {
this.function = function;
}
void internet() {
this.function.internet();
}
}
class XM extends Phone { // 具体手机类 扩展品牌手机
public XM(Function function) {
super(function);
}
public void internet() {
System.out.println("XM 手机上网");
super.internet();
}
}
class Client {
public static void main(String[] args) {
Phone phone = new XM(new FourGFunction());
phone.internet();
phone = new XM(new FiveGFunction());
phone.internet();
}
}
桥接模式的优缺点简要分析
1、实现了抽象和实现部分的分离,从而提高了系统的灵活性,让抽象部分和实现部分独立开,这样有助于系统进行分层设计,从而产生更灵活的结构化系统。
2、对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了,其它由具体业务来完成。
3、桥接模式代替多继承的方案,可以减少子类的个数,降低系统的管理和维护成本。
4、桥接模式的引入增加的系统的理解和设计难度,由于聚合关系建立在抽象层,要求开发者针对抽象进行设计和编程。
5、桥接模式要求正确识别出系统中两个独立变化的维度,因此使用范围有一定的局限性。应用场景:对于那些不希望使用继承或者因为对层次继承导致系统类的个数急剧增加,桥接模式尤为适用。