定义:
桥接模式(Bridge Pattern)是一个比较简单的模式,其定义如下: Decouple an abstraction from its implementation so that the two can vary independently.(将抽象和实现解耦,使得两者可以独立地变化。)
桥接模式通用类图
桥接设计模式的核心思想是通过组合而不是继承来实现抽象和实现的分离。它使用一个桥接接口将抽象和实现连接起来,使得抽象和实现可以独立地进行扩展和变化。
角色:
桥接模式包含以下几个核心角色:
1、抽象化(Abstraction):抽象化定义了抽象类的接口,它持有一个实现化角色的引用。抽象化角色通常包含一些业务逻辑方法,这些方法会调用实现化角色的方法来完成具体的操作。
2、扩展抽象化(Refined Abstraction):扩展抽象化是抽象化角色的子类,它对抽象化角色进行了进一步的扩展,增加了一些额外的功能。
3、实现化(Implementor):实现化定义了实现类的接口,它是抽象化角色所依赖的接口。实现化角色通常包含一些具体的实现方法。
4、具体实现化(Concrete Implementor):具体实现化是实现化角色的具体实现类,它实现了实现化接口中定义的方法。
代码示例:
下面我们通过一个简单的示例来演示桥接模式的实现。我们以多支付方式(微信、支付宝)和多支付模式(人脸识别、指纹识别、密码)为例。
// 支付方式抽象类
public abstract class IPay {
protected IPayMode payMode;
public IPay(IPayMode payMode) {
this.payMode = payMode;
}
public abstract void pay(double money);
}
// 微信支付
public class WxPay extends IPay{
public WxPay(IPayMode payMode) {
super(payMode);
}
@Override
public void pay(double money) {
payMode.getPayMode();
System.out.println("微信支付");
}
}
// 支付宝支付
public class ZfbPay extends IPay{
public ZfbPay(IPayMode payMode) {
super(payMode);
}
@Override
public void pay(double money) {
payMode.getPayMode();
System.out.println("支付宝支付");
}
}
// 支付模式接口
public interface IPayMode {
void getPayMode();
}
// 密码支付模式
public class CypherPayMode implements IPayMode{
@Override
public void getPayMode() {
System.out.println("密码支付模式");
}
}
// 人脸支付模式
public class FacePayMode implements IPayMode{
@Override
public void getPayMode() {
System.out.println("人脸支付模式");
}
}
// 指纹支付模式
public class FingerPayMode implements IPayMode{
@Override
public void getPayMode() {
System.out.println("指纹支付模式");
}
}
优点 :
1、解耦抽象和实现:桥接设计模式将抽象部分与实现部分分离,使它们可以独立地变化,降低了类之间的耦合度。
2、提高可扩展性:由于抽象和实现可以独立扩展,我们可以很方便地添加新的抽象类或实现类,而不会影响到现有的代码。
3、实现细节对客户端透明:客户端只需要与抽象化角色进行交互,不需要了解具体的实现细节,提高了系统的封装性。
缺点:
1、增加系统的复杂性:桥接设计模式引入了多个角色和接口,增加了系统的复杂性。对于简单的系统来说,使用桥接设计模式可能会显得过于繁琐。
2、理解和维护难度较大:由于抽象和实现分离,代码的结构变得更加复杂,理解和维护的难度也相应增加。
使用场景:
(一)避免继承导致的类爆炸
当一个类存在多个维度的变化时,如果使用继承来实现,会导致类的数量急剧增加,形成类爆炸。桥接设计模式可以将这些维度分离,通过组合的方式来实现不同维度的变化,避免了类爆炸的问题。
(二)需要独立扩展抽象和实现
如果抽象部分和实现部分都需要独立地进行扩展和变化,桥接设计模式可以让它们互不影响。
(三)系统需要在多个实现之间切换
当系统需要在多个不同的实现之间进行切换时,桥接设计模式可以提供一种灵活的解决方案。只需要在抽象化角色中持有不同的实现化角色的引用,就可以在运行时动态地切换实现。
桥接设计模式通过将抽象部分与实现部分分离,为我们提供了一种灵活、可扩展的解决方案。它能够有效地避免继承带来的类爆炸问题,使系统更加易于维护和扩展。在实际开发中,当我们遇到需要处理多个维度变化的情况时,可以考虑使用桥接设计模式。但同时我们也需要注意它可能带来的复杂性,确保在合适的场景下使用该模式。希望通过本文的介绍,你对桥接设计模式有了更深入的理解和认识。