当前位置: 首页 > article >正文

结构型模式2.桥接模式

结构型模式

  1. 适配器模式(Adapter Pattern)
  2. 桥接模式(Bridge Pattern)
  3. 组合模式(Composite Pattern)
  4. 装饰器模式(Decorator Pattern)
  5. 外观模式(Facade Pattern)
  6. 享元模式(Flyweight Pattern)
  7. 代理模式(Proxy Pattern)

桥接模式(Bridge Pattern)是一种结构型设计模式,它通过将抽象部分与其实现部分分离,使得二者可以独立地变化。它主要用于解耦抽象与实现之间的关系,允许二者独立扩展。

关键概念

  • 抽象(Abstraction):定义了抽象部分的接口,通常是客户端调用的接口。
  • 扩充抽象(Refined Abstraction):是对抽象部分的具体实现,通常是对某些方法的细化。
  • 实现(Implementor):定义了实现部分的接口,但不提供具体的实现。
  • 具体实现(Concrete Implementor):提供实现接口的具体实现。

举个例子:远程控制器

假设我们有不同类型的遥控器和设备,遥控器可以控制不同的设备。我们使用桥接模式来解耦遥控器的操作逻辑与设备的控制逻辑,使得遥控器和设备可以独立扩展。

// 设备接口,定义所有设备的基本操作
public interface Device {
    void turnOn(); // 打开设备
    void turnOff(); // 关闭设备
    void setVolume(int volume); // 设置音量
}

// 电视机类,具体的设备实现
public class TV implements Device {
    private int volume;

    @Override
    public void turnOn() {
        System.out.println("电视机打开了");
    }

    @Override
    public void turnOff() {
        System.out.println("电视机关闭了");
    }

    @Override
    public void setVolume(int volume) {
        this.volume = volume;
        System.out.println("电视机音量设置为: " + volume);
    }
}

// 收音机类,具体的设备实现
public class Radio implements Device {
    private int volume;

    @Override
    public void turnOn() {
        System.out.println("收音机打开了");
    }

    @Override
    public void turnOff() {
        System.out.println("收音机关闭了");
    }

    @Override
    public void setVolume(int volume) {
        this.volume = volume;
        System.out.println("收音机音量设置为: " + volume);
    }
}
// 遥控器接口,定义遥控器的基本操作
public abstract class RemoteControl {
    protected Device device; // 关联一个设备

    public RemoteControl(Device device) {
        this.device = device;
    }

    public abstract void turnOn(); // 开启设备
    public abstract void turnOff(); // 关闭设备
    public abstract void setVolume(int volume); // 设置音量
}


// 基本遥控器,提供简单的开关和音量控制
public class BasicRemote extends RemoteControl {

    public BasicRemote(Device device) {
        super(device);
    }

    @Override
    public void turnOn() {
        device.turnOn();
    }

    @Override
    public void turnOff() {
        device.turnOff();
    }

    @Override
    public void setVolume(int volume) {
        device.setVolume(volume);
    }
}


public class Client {
    public static void main(String[] args) {
        // 创建设备
        Device tv = new TV();
        Device radio = new Radio();

        // 创建遥控器并控制不同的设备
        RemoteControl basicRemote = new BasicRemote(tv);
        System.out.println("使用遥控器控制电视:");
        basicRemote.turnOn();
        basicRemote.setVolume(15);
        basicRemote.turnOff();

        System.out.println("\n使用遥控器控制收音机:");
        basicRemote = new BasicRemote(radio);
        basicRemote.turnOn();
        basicRemote.setVolume(10);
        basicRemote.turnOff();
    }
}

解释

  1. 抽象部分RemoteControl 是抽象类,它定义了对设备的操作方法(turnOn()turnOff()setVolume()),但没有指定具体的设备。

  2. 实现部分Device 接口定义了所有设备应该具备的操作方法,并且由具体的设备(如 TVRadio)实现这些操作。

  3. 桥接:通过构造方法将设备传递给遥控器(RemoteControl),遥控器可以操作不同类型的设备,从而实现了设备和遥控器的解耦。

  4. 扩展:如果以后增加新类型的设备(如空调、音响等),我们只需要创建新的 Device 实现类,而不需要修改 RemoteControl 类;同样,如果我们需要增加更复杂的遥控器功能,也可以直接在 RemoteControl 类中扩展。

优点

  1. 解耦:抽象部分和实现部分解耦,可以独立变化。
  2. 灵活性:可以在不影响其他部分的情况下扩展系统。
  3. 可维护性:修改具体的设备或遥控器时,其他部分不需要修改。

适用场景

  1. 多个类的变体:当有多个类的不同变体,并且需要对这些变体进行操作时,可以使用桥接模式。
  2. 避免类爆炸:当系统需要结合多个维度的变化(如不同设备和不同类型的遥控器),可以使用桥接模式避免组合类导致的类爆炸。

总结

桥接模式是一种非常强大的结构性设计模式,可以有效地分离抽象与实现,允许独立地扩展两者,减少系统的复杂度。在面对多个变化维度时,桥接模式尤其有用。


http://www.kler.cn/a/469910.html

相关文章:

  • Electron使用记录
  • 【Duilib】 List控件支持多选和获取选择的多条数据
  • AI Development Notes 1 - introduction with the OpenAI API Development
  • 苹果系统MacOS下ObjectC建立的App程序访问opencv加载图片程序
  • 计算机网络与服务器
  • OpenGL —— 流媒体播放器 - ffmpeg解码rtsp流,opengl渲染yuv视频(附源码,glfw+glad)
  • springboot配置线程池
  • 今日总结 2025-01-06
  • 软件工程大复习之(四)——面向对象与UML
  • win32汇编环境,在窗口程序中画五边形与六边形
  • Unity3D PBR光照计算公式推导详解
  • 土建施工员考试题库及答案
  • 社交新零售下开源 AI 智能名片 2+1 链动模式 S2B2C 商城小程序的促单策略研究
  • MR20强抗干扰一体式IO模块的革新力量
  • KACL:Knowledge-Adaptive Contrastive Learning for Recommendation
  • C++ 原子变量
  • Bash语言的函数实现
  • Spring Boot 项目离线环境手动构建指南
  • Android客制化------7.0设置壁纸存在的一些问题
  • 神经网络第一课
  • HTML语言的数据库交互
  • 【JavaWeb学习Day09】
  • 有限元分析学习——Anasys Workbanch第一阶段笔记(7)对称问题预备水杯案例分析
  • Oracle Dataguard 需要配置的参数详解
  • amis系列开发
  • 位向量系统函数