一.说明
桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类,这两种类型的类可被结构化改变而互不影响。桥接模式的目的是将抽象与实现分离,使它们可以独立地变化,该模式通过将一个对象的抽象部分与它的实现部分分离,使它们可以独立地改变。它通过组合的方式,而不是继承的方式,将抽象和实现的部分连接起来。
通俗的解释:
首先需要澄清上文中的“抽象化” != “抽象类”,"实现化" != "实现类", 而是高层的业务逻辑或行为描述。如何理解?在桥接模式中,“抽象化”和“实现化”是两个独立的维度,分别代表“高层行为”和“底层实现方式”。比如支付渠道(抽象类)和支付方式(实现类),桥接模式的目的是让这两者可以独立的变化,而不影响彼此。
/**
* 实现类部分:支付方式接口
* 定义底层支付逻辑,供抽象类调用
*/
public interface PaymentMethod {
/**
* 执行实际支付操作
* @param amount 支付金额
*/
void pay(double amount);
}
/**
* 具体实现类:支付宝支付方式
*/
public class Alipay implements PaymentMethod {
@Override
public void pay(double amount) {
System.out.println("[支付宝支付] 正在处理金额: " + amount + "元");
}
}
/**
* 具体实现类:微信支付方式
*/
public class WechatPay implements PaymentMethod {
@Override
public void pay(double amount) {
System.out.println("[微信支付] 正在处理金额: " + amount + "元");
}
}
/**
* 抽象类部分:支付渠道基类
* 描述高层行为,持有支付方式的引用
*/
public abstract class PaymentChannel {
// 实现部分:支付方式接口的引用
protected final PaymentMethod paymentMethod;
/**
* 构造函数:注入支付方式
* @param paymentMethod 支付方式的具体实现
*/
protected PaymentChannel(PaymentMethod paymentMethod) {
this.paymentMethod = paymentMethod;
}
/**
* 高层方法:执行支付流程
* @param amount 支付金额
*/
public abstract void processPayment(double amount);
}
/**
* 扩展抽象类:APP支付渠道
*/
public class AppPayment extends PaymentChannel {
/**
* 构造函数:指定支付方式
* @param paymentMethod 支付方式的具体实现
*/
public AppPayment(PaymentMethod paymentMethod) {
super(paymentMethod);
}
@Override
public void processPayment(double amount) {
System.out.println("== APP支付流程启动 ==");
// 调用实现部分的方法完成实际支付
paymentMethod.pay(amount);
System.out.println("== APP支付流程结束 ==\n");
}
}
/**
* 扩展抽象类:网页支付渠道
*/
public class WebPayment extends PaymentChannel {
/**
* 构造函数:指定支付方式
* @param paymentMethod 支付方式的具体实现
*/
public WebPayment(PaymentMethod paymentMethod) {
super(paymentMethod);
}
@Override
public void processPayment(double amount) {
System.out.println("== 网页支付流程启动 ==");
// 调用实现部分的方法完成实际支付
paymentMethod.pay(amount);
System.out.println("== 网页支付流程结束 ==\n");
}
}
public static void main(String[] args) {
// 场景一:网页支付 + 微信支付
System.out.println("--- 场景一:网页支付 + 微信支付 ---");
PaymentMethod wechatPay = new WechatPay();
PaymentChannel webPaymentWithWechat = new WebPayment(wechatPay);
webPaymentWithWechat.processPayment(99.9);
// 场景二:APP支付 + 支付宝支付
System.out.println("--- 场景二:APP支付 + 支付宝支付 ---");
PaymentMethod alipay = new Alipay();
PaymentChannel appPaymentWithAlipay = new AppPayment(alipay);
appPaymentWithAlipay.processPayment(199.9);
// 场景三:新增支付方式或渠道时无需修改已有代码
System.out.println("--- 场景三:轻松扩展新支付方式和渠道 ---");
// 可以动态组合任意支付方式和渠道
PaymentChannel anotherWebPaymentWithAlipay = new WebPayment(alipay);
anotherWebPaymentWithAlipay.processPayment(299.9);
}
运行结果如下:
--- 场景一:网页支付 + 微信支付 ---
== 网页支付流程启动 ==
[微信支付] 正在处理金额: 99.9元
== 网页支付流程结束 ==--- 场景二:APP支付 + 支付宝支付 ---
== APP支付流程启动 ==
[支付宝支付] 正在处理金额: 199.9元
== APP支付流程结束 ==--- 场景三:轻松扩展新支付方式和渠道 ---
== 网页支付流程启动 ==
[支付宝支付] 正在处理金额: 299.9元
== 网页支付流程结束 ==
如果本文对你有帮助,点击右上角【订阅专栏】或左上角关注我
完整的23中设计模式干货,第一时间推送给你!
有什么问题也可以在评论区讨论