桥接模式(Bridge Pattern)是一种结构型设计模式,用于将抽象部分与其实现部分分离,使它们可以独立变化。该模式通过组合关系替代继承关系,降低了抽象和实现之间的耦合度。

桥接模式的结构

桥接模式通常包含以下角色:

  • 抽象化(Abstraction):定义抽象类的接口,维护一个指向实现化对象的引用。
  • 扩展抽象化(RefinedAbstraction):扩展抽象化角色,改变或修正父类对抽象化的定义。
  • 实现化(Implementor):定义实现类的接口,供抽象化角色调用。
  • 具体实现化(ConcreteImplementor):实现实现化接口的具体类。

桥接模式的实现示例

package cn.wjh.designpattern.bridge;

/**
 * 品牌
 */
public interface Brand {
    void open();
    void close();
    void call();
}
package cn.wjh.designpattern.bridge;

public abstract class Phone {
    private final Brand brand;

    public Phone(Brand brand) {
        super();
        this.brand = brand;
    }

    /**
     * 开机
     */
    protected void open(){
        this.brand.open();
    }

    /**
     * 关机
     */
    protected void close(){
        this.brand.close();
    }

    /**
     * 拨打电话
     */
    protected void call(){
        this.brand.call();
    }
}

package cn.wjh.designpattern.bridge;

/**
 * 苹果手机
 */
public class Apple implements Brand{
    @Override
    public void open() {
        System.out.println("苹果手机开机");
    }

    @Override
    public void close() {
        System.out.println("苹果手机关机");
    }

    @Override
    public void call() {
        System.out.println("苹果手机打电话");
    }
}
package cn.wjh.designpattern.bridge;

/**
 * 小米手机
 */
public class XiaoMi implements Brand{
    @Override
    public void open() {
        System.out.println("小米手机开机");
    }

    @Override
    public void close() {
        System.out.println("小米手机关机");
    }

    @Override
    public void call() {
        System.out.println("小米手机打电话");
    }
}
package cn.wjh.designpattern.bridge;

/**
 * iPhone18ProMax
 */
public class IPhone18PM extends Phone{
    public IPhone18PM(Brand brand) {
        super(brand);
    }
    public void open(){
        super.open();
        System.out.println("IPhone18PM open");
    }
    public void close(){
        super.close();
        System.out.println("IPhone18PM close");
    }
    public void call(){
        super.call();
        System.out.println("IPhone18PM call");
    }
}
package cn.wjh.designpattern.bridge;

/**
 * 小米18
 */
public class XiaoMi18 extends Phone{
    public XiaoMi18(Brand brand) {
        super(brand);
    }
    public void open(){
        super.open();
        System.out.println("XiaoMi18 open");
    }
    public void close(){
        super.close();
        System.out.println("XiaoMi18 close");
    }
    public void call(){
        super.call();
        System.out.println("XiaoMi18 call");
    }
}
package cn.wjh.designpattern.bridge;

public class Main {
    public static void main(String[] args) {
        IPhone18PM iPhone18PM = new IPhone18PM(new Apple());
        iPhone18PM.open();
        iPhone18PM.call();
        iPhone18PM.close();
        System.out.println("-------------------------------------------");
        XiaoMi18 xiaoMi18 = new XiaoMi18(new XiaoMi());
        xiaoMi18.open();
        xiaoMi18.call();
        xiaoMi18.close();

    }
}

运行结果

桥接模式的优点

  • 解耦抽象与实现:抽象和实现可以独立扩展,互不影响。
  • 提高扩展性:可以动态切换实现类,无需修改抽象层代码。
  • 符合开闭原则:新增抽象或实现类时,无需修改现有代码。

桥接模式的应用场景

  • 当一个类存在多个独立变化的维度时,可以使用桥接模式将这些维度分离。
  • 避免因多层继承导致的类爆炸问题。
  • 需要在运行时切换不同实现时。

桥接模式与适配器模式的区别

  • 桥接模式:设计初期使用,目的是将抽象与实现分离。
  • 适配器模式:后期使用,目的是让不兼容的接口协同工作。
Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐