一、概要
桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象部分与实现部分分离,使它们都可以独⽴的变化。其核心思想就是解耦,在面向对象编程中,抽象和实现是通过继承关系来实现的,但这种关系是静态的,不能在运行时动态改变,而桥接模式是通过组合关系来取代继承关系,从而实现抽象部分和实现部分之间的解耦,提高系统的灵活性和可维护性。对应现实生活,它把事物的两个维度分离,使得这两个维度可以独立的变化,维度之间可以灵活的组合。
比如生活中的支付场景,要完成一次支付,首先你要考虑使用哪种支付平台,用微信支付还是支付宝支付。选定平台后,如何去支付,是用密码支付,还是指纹支付。在这种场景下,支付平台和支付方式就是事物的两个维度,分别对应抽象层和实现层,这两个维度可以独立变化,独立扩展。最后通过一个桥接结构将两个维度进行关联,所有的支付情景就是两个维度子项的笛卡尔积。很显然,通过桥接模式可以避免建立这个“积”数量个的类继承关系。
优点
- 分离抽象和实现,降低系统的耦合度,提升系统的扩展性。
- 符合开闭原则,即对扩展开放,对修改关闭。
- 隐藏具体实现细节,使得系统更加安全,更加稳定。
- 细化控制,桥接模式允许在运行时动态地选择具体实现,提供更大的灵活性和自由度。
缺点
- 增加系统复杂性,桥接模式需要引入抽象部分和实现部分的抽象类和具体实现类,会增加类的数量,同时需要管理抽象部分和实现部分之间的关联关系。
- 增加系统的理解与设计难度,增加开发工作量。
适用场景
-
当需要分离抽象部分和实现部分,降低系统耦合时,可以使用桥接模式。
-
当希望在抽象部分和实现部分之间建立灵活的组合关系,避免在两个层次之间建立静态继承时。
-
当一个事物存在两个独立变化的维度,且这两个维度都需要进行扩展,适合使用桥接模式。
-
对于那些不希望因使用继承或多层次继承导致类数量爆炸增长的系统,桥接模式也尤为适用。
二、模拟支付场景
对于上述的支付场景,无论支付平台以及支付方式如何扩展,我们都可以通过桥接模式来组合系统中的所有支付情景。系统总体结构如下:
步骤1:模拟支付方式接口PayMode和其两大实现
public interface PayMode {
void paymode();
}
public class PasswordPay implements PayMode{
@Override
public void paymode() {
System.out.println("--用密码支付");
}
}
public class FingerPay implements PayMode{
@Override
public void paymode() {
System.out.println("--用指纹支付");
}
}
步骤2:创建抽象类Pay,和两大支付平台实现类
Tip:这里创建的是抽象类Pay而不是接口,因为需要在类中持有PayMode的引用,这个引用就是所谓的“桥”。还需要注意一点,payMode访问修饰符为protected,方便继承给子类。
public abstract class Pay {
protected PayMode paymode;
public Pay(PayMode paymode) {
this.paymode = paymode;
}
public abstract void pay();
}
public class WechatPay extends Pay{
public WechatPay(PayMode paymode) {
super(paymode);
}
@Override
public void pay() {
System.out.println("微信支付:");
paymode.paymode();
}
}
public class AliPay extends Pay{
public AliPay(PayMode paymode) {
super(paymode);
}
@Override
public void pay() {
System.out.println("支付宝支付:");
paymode.paymode();
}
}
步骤3:客户端测试
public class Client {
public static void main(String[] args) {
Pay wechatPay1=new WechatPay(new PasswordPay());
Pay wechatPay2=new WechatPay(new FingerPay());
wechatPay1.pay();
wechatPay2.pay();
System.out.println();
Pay aliPay1=new AliPay(new PasswordPay());
Pay aliPay2=new AliPay(new FingerPay());
aliPay1.pay();
aliPay2.pay();
}
}
测试结果
三、总结
本文详细讲解了桥接模式的原理和实现,通过模拟经典的支付场景,让你进一步加深对桥接模式的理解。总的来说,桥接模式在将抽象和实现解耦、提高系统的可扩展性和灵活性方面非常有用。然而,桥接模式的引入会增加系统的理解与设计难度,在设计阶段应根据实际需求和系统的复杂度来评估是否使用桥接模式。
希望这篇文章对你的学习有所帮助!如果你觉得这篇文章对你有帮助,请不要吝啬你的赞美和分享。在此感谢你的阅读,我们下次再见!