16.桥接模式

桥接模式

介绍

桥接模式是一种结构型设计模式,它通过将抽象部分与实现部分分离,使它们可以独立变化。这种模式通过组合的方式来实现,而不是继承。桥接模式通过将抽象和实现解耦,从而实现抽象和实现的分离,使得系统更加灵活。

角色

  • Abstraction(抽象类): 定义抽象类,包含一个对实现接口的引用,并定义一些抽象方法。

  • RefinedAbstraction(扩充抽象类): 对抽象类进行扩充,可以继承抽象类并实现抽象方法。

  • Implementor(实现类接口): 定义实现类的接口,可以包含一些基本的操作。

  • ConcreteImplementor(具体实现类): 实现Implementor接口的具体实现类。

使用场景

当我们要实现的系统可能存在多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合。

结构图

案例

假设我们要设计一个远程控制器,它可以控制不同的设备,比如电视和音响。使用桥接模式可以使控制器和设备之间的关系更加灵活。

代码

java 复制代码
// Implementor(实现类接口)
interface Device {
    void turnOn();
    void turnOff();
    void setChannel(int channel);
}
java 复制代码
// ConcreteImplementor(具体实现类1)
class TV implements Device {
    @Override
    public void turnOn() {
        System.out.println("TV is turned on");
    }

    @Override
    public void turnOff() {
        System.out.println("TV is turned off");
    }

    @Override
    public void setChannel(int channel) {
        System.out.println("TV channel set to " + channel);
    }
}
java 复制代码
// ConcreteImplementor(具体实现类2)
class Stereo implements Device {
    @Override
    public void turnOn() {
        System.out.println("Stereo is turned on");
    }

    @Override
    public void turnOff() {
        System.out.println("Stereo is turned off");
    }

    @Override
    public void setChannel(int channel) {
        System.out.println("Stereo channel set to " + channel);
    }
}
java 复制代码
// Abstraction(抽象类)
abstract class RemoteControl {
    protected Device device;

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

    public abstract void turnOn();
    public abstract void turnOff();
    public abstract void setChannel(int channel);
}
java 复制代码
// RefinedAbstraction(扩充抽象类)
class BasicRemoteControl extends RemoteControl {
    public BasicRemoteControl(Device device) {
        super(device);
    }

    @Override
    public void turnOn() {
        System.out.print("Basic remote: ");
        device.turnOn();
    }

    @Override
    public void turnOff() {
        System.out.print("Basic remote: ");
        device.turnOff();
    }

    @Override
    public void setChannel(int channel) {
        System.out.print("Basic remote: ");
        device.setChannel(channel);
    }
}
java 复制代码
// RefinedAbstraction(扩充抽象类)
class AdvancedRemoteControl extends RemoteControl {
    public AdvancedRemoteControl(Device device) {
        super(device);
    }

    @Override
    public void turnOn() {
        System.out.print("Advanced remote: ");
        device.turnOn();
    }

    @Override
    public void turnOff() {
        System.out.print("Advanced remote: ");
        device.turnOff();
    }

    @Override
    public void setChannel(int channel) {
        System.out.print("Advanced remote: ");
        device.setChannel(channel);
    }

    public void mute() {
        System.out.println("Mute");
    }
}
java 复制代码
// Client(客户端)
public class BridgePatternExample {
    public static void main(String[] args) {
        // 使用桥接模式创建远程控制器和设备的组合
        TV tv = new TV();
        Stereo stereo = new Stereo();

        RemoteControl basicRemote = new BasicRemoteControl(tv);
        RemoteControl advancedRemote = new AdvancedRemoteControl(stereo);

        // 使用远程控制器控制设备
        basicRemote.turnOn();
        basicRemote.setChannel(5);
        basicRemote.turnOff();

        System.out.println();

        advancedRemote.turnOn();
        advancedRemote.setChannel(10);
        advancedRemote.turnOff();
        ((AdvancedRemoteControl) advancedRemote).mute();
    }
}
相关推荐
zhougl9963 分钟前
Java实现腾讯云开发者社区列表爬虫
java·爬虫·腾讯云
智码看视界5 分钟前
Day49-AI微服务化-将大模型能力封装为标准微服务
java·微服务·ai·架构·大模型·sse流式输出·ai中台
Nebula_g5 分钟前
JavaSE基础语法:特殊类(特殊情景下的设计模式)
java·开发语言·设计模式
2401_8949155331 分钟前
Geo 优化源码部署避坑指南:解决访问异常、定位失效、收录卡顿问题
java·服务器·后端·缓存·开源
Dovis(誓平步青云)32 分钟前
《 固井工程软件 Cemsol 的数据管理与国产化适配实践》
android·java·开发语言·人工智能
大模型码小白34 分钟前
AI安全前沿:AI大模型安全防护的前沿技术
java·网络·人工智能·python·深度学习·学习·安全
evans在进步37 分钟前
LeetCode 34:在排序数组中查找元素的首尾位置——Java 两次二分查找详解
java·python·leetcode
@卓越俊逸_角立杰出@43 分钟前
java实现Agent+ReAct demo(Spring Boot + Spring AI Alibaba ReAct Agent)
java·spring·react.js
看浪的路人43 分钟前
第6讲:SQL 解析器
java·开发语言·数据库
weixin_440784111 小时前
【OkHttp实现原理】
android·java·okhttp