八.桥接模式

一.说明

        桥接(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中设计模式干货,第一时间推送给你!
有什么问题也可以在评论区讨论 

你可能感兴趣的:(八.桥接模式)