目录
1.桥接模式定义
2.优点
3.缺点
4.桥接模式结构说明
5.工作流程
6.示例
7.代码练习
8.应用场景
9.本质
10.涉及的设计原则
11.相关设计模式
12.开源框架中的应用
桥接模式定义
将抽象与实现解耦,使它们都可以独立的变化。
优点
-
分离抽象和实现:桥接模式允许抽象部分和实现部分分离,使它们可以独立扩展和变化,符合开闭原则。
-
更好的可扩展性:通过引入抽象层次结构,可以轻松添加新的抽象和实现,不会影响现有的代码。
-
隐藏实现细节:客户端无需了解实现的细节,只需与抽象部分交互,降低了耦合度。
缺点
-
复杂性增加:桥接模式引入了额外的抽象层次结构,可能会增加代码的复杂性。
-
增加类的数量:引入抽象类和具体实现类会增加类的数量,可能会使项目更加庞大
桥接模式结构说明
-
抽象类(Abstraction):抽象类定义了一个抽象部分的接口,并包含对实现部分的引用。
-
扩展抽象类(Refined Abstraction):扩展抽象类是抽象类的子类,它可以添加更多功能或修改抽象类的行为。
-
实现接口(Implementor):实现接口定义了实现部分的接口,通常包括实现抽象方法。
-
具体实现类(Concrete Implementor):具体实现类是实现接口的具体实现,它实现了实现接口中定义的方法。
工作流程
-
客户端使用抽象类或扩展抽象类来创建对象。
-
抽象类内部包含一个对实现接口的引用,通过这个引用调用实现接口的方法。
-
具体实现类实现了实现接口的方法,提供了具体的实现。
-
客户端可以通过抽象类来调用实现类的方法,而不需要直接与具体实现类交互。
示例
扩展下桥接模式的定义:实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让他们独自变化,减少他们之间的耦合。
目的在于扩展,就比如手机接打电话发信息的功能扩展到现在的手机商店和后台进程管理:苹果的AppStore和安卓的应用宝,苹果的全后台静默和安卓的后台一键清理。
代码练习
1.创建实现接口-Function,包含手机商店和后台进程管理功能。
// 实现接口 - 功能
public abstract class Function {
public abstract void phoneStore();
public abstract void processManage();
}
2.创建具体实现类安卓手机和苹果手机,实现手机商店和后台进程管理功能:
// 具体实现类 - 安卓手机
public class AndroidPhone extends Function {
@Override
public void phoneStore() {
System.out.println("安卓手机应用宝...");
}
@Override
public void processManage() {
System.out.println("安卓手机后台全清理...");
}
}
// 具体实现类 - 苹果手机
public class AppPhone extends Function {
@Override
public void phoneStore() {
System.out.println("苹果手机Appstore...");
}
@Override
public void processManage() {
System.out.println("苹果手机后台进程都挂着...");
}
}
3.创建抽象类Phone,包含实现类的实例接口的引用,通过引用调用实现接口的方法。
// 抽象类 - 手机
public abstract class Phone {
protected Function function;
public void setFunction(Function function) {
this.function = function;
}
public abstract void usePhoneStore();
public abstract void userPhoneProcessManage();
}
4.创建扩展抽象类实现抽象类功能
// 扩展抽象类 - 苹果系统手机
public class AppleOSPhone extends Phone {
@Override
public void usePhoneStore() {
function.phoneStore();
}
@Override
public void userPhoneProcessManage() {
function.processManage();
}
}
// 扩展抽象类 - 安卓系统手机
public class AndroidOSPhone extends Phone {
@Override
public void usePhoneStore() {
function.phoneStore();
}
@Override
public void userPhoneProcessManage() {
function.processManage();
}
}
5.客户端代码调用:
public class Client {
public static void main(String[] args) {
Phone phone = new AppleOSPhone();
phone.setFunction(new AppPhone());
phone.usePhoneStore();
phone.userPhoneProcessManage();
phone = new AndroidOSPhone();
phone.setFunction(new AndroidPhone());
phone.usePhoneStore();
phone.userPhoneProcessManage();
}
}
应用场景
-
当需要分离一个抽象部分和它的实现部分,使它们可以独立扩展时,可以使用桥接模式。
-
当一个类有多个维度的变化(例如,颜色和形状),需要将这些维度分离,以支持不同组合时,桥接模式很有用。
-
当希望隐藏实现细节,只向客户端暴露抽象部分时,可以使用桥接模式。
本质
桥接模式的本质是分离抽象和实现,允许它们独立变化。
涉及的设计原则
- 开闭原则(Open/Closed Principle):桥接模式允许抽象部分和实现部分独立扩展,符合开闭原则。
相关设计模式
- 组合模式(Composite Pattern):组合模式可以与桥接模式一起使用,将复杂对象分解为部分-整体的结构,然后使用桥接模式将抽象部分和实现部分分离。
- 装饰者模式(Decorator Pattern):装饰者模式和桥接模式都可以用于分离抽象和实现。
开源框架中的应用
JDBC(Java Database Connectivity):JDBC是Java中用于访问数据库的API。它使用了桥接模式来将不同的数据库驱动程序与通用的数据库访问接口进行分离。这使得开发者可以编写与数据库无关的代码,并根据需要切换不同的数据库驱动程序。