Java 桥接模式讲解和代码示例

简介: Java 桥接模式讲解和代码示例

桥接是一种结构型设计模式 可将业务逻辑或一个大类拆分为不同的层次结构 从而能独立地进行开发

层次结构中的第一层 通常称为抽象部分 将包含对第二层 实现部分 对象的引用 抽象部分将能将一些 有时是绝大部分 对自己的调用委派给实现部分的对象 所有的实现部分都有一个通用接口 因此它们能在抽象部分内部相互替换

 


使用示例桥接模式在处理跨平台应用 支持多种类型的数据库服务器或与多个特定种类 例如云平台和社交网络等 的 API 供应商协作时会特别有用

识别方法桥接可以通过一些控制实体及其所依赖的多个不同平台之间的明确区别来进行识别

01设备和远程控制之间的桥接

本例展示了远程控制器及其所控制的设备的类之间的分离

远程控制器是抽象部分 设备则是其实现部分 由于有通用的接口 同一远程控制器可与不同的设备合作 反过来也一样

桥接模式允许在不改动另一层次代码的前提下修改已有类 甚至创建新类

02devices

devices/Device.java: 所有设备的通用接口

package refactoring_guru.bridge.example.devices;public interface Device {    boolean isEnabled();    void enable();    void disable();    int getVolume();    void setVolume(int percent);    int getChannel();    void setChannel(int channel);    void printStatus();
}

devices/Radio.java: 收音机

package refactoring_guru.bridge.example.devices;public class Radio implements Device {    private boolean on = false;    private int volume = 30;    private int channel = 1;    @Override
    public boolean isEnabled() {        return on;
    }    @Override
    public void enable() {        on = true;
    }    @Override
    public void disable() {        on = false;
    }    @Override
    public int getVolume() {        return volume;
    }    @Override
    public void setVolume(int volume) {        if (volume > 100) {            this.volume = 100;
        } else if (volume < 0) {            this.volume = 0;
        } else {            this.volume = volume;
        }
    }    @Override
    public int getChannel() {        return channel;
    }    @Override
    public void setChannel(int channel) {        this.channel = channel;
    }    @Override
    public void printStatus() {        System.out.println("------------------------------------");        System.out.println("| I'm radio.");        System.out.println("| I'm " + (on ? "enabled" : "disabled"));        System.out.println("| Current volume is " + volume + "%");        System.out.println("| Current channel is " + channel);        System.out.println("------------------------------------\n");
    }
}

devices/Tv.java: 电视机

package refactoring_guru.bridge.example.devices;public class Tv implements Device {    private boolean on = false;    private int volume = 30;    private int channel = 1;    @Override
    public boolean isEnabled() {        return on;
    }    @Override
    public void enable() {        on = true;
    }    @Override
    public void disable() {        on = false;
    }    @Override
    public int getVolume() {        return volume;
    }    @Override
    public void setVolume(int volume) {        if (volume > 100) {            this.volume = 100;
        } else if (volume < 0) {            this.volume = 0;
        } else {            this.volume = volume;
        }
    }    @Override
    public int getChannel() {        return channel;
    }    @Override
    public void setChannel(int channel) {        this.channel = channel;
    }    @Override
    public void printStatus() {        System.out.println("------------------------------------");        System.out.println("| I'm TV set.");        System.out.println("| I'm " + (on ? "enabled" : "disabled"));        System.out.println("| Current volume is " + volume + "%");        System.out.println("| Current channel is " + channel);        System.out.println("------------------------------------\n");
    }
}

remotes/Remote.java: 所有远程控制器的通用接口



package refactoring_guru.bridge.example.remotes;public interface Remote {    void power();    void volumeDown();    void volumeUp();    void channelDown();    void channelUp();}

remotes/BasicRemote.java: 基础远程控制器

package refactoring_guru.bridge.example.remotes;import refactoring_guru.bridge.example.devices.Device;public class BasicRemote implements Remote {    protected Device device;    public BasicRemote() {}    public BasicRemote(Device device) {        this.device = device;
    }    @Override
    public void power() {        System.out.println("Remote: power toggle");        if (device.isEnabled()) {            device.disable();
        } else {            device.enable();
        }
    }    @Override
    public void volumeDown() {        System.out.println("Remote: volume down");        device.setVolume(device.getVolume() - 10);
    }    @Override
    public void volumeUp() {        System.out.println("Remote: volume up");        device.setVolume(device.getVolume() + 10);
    }    @Override
    public void channelDown() {        System.out.println("Remote: channel down");        device.setChannel(device.getChannel() - 1);
    }    @Override
    public void channelUp() {        System.out.println("Remote: channel up");        device.setChannel(device.getChannel() + 1);
    }
}

remotes/AdvancedRemote.java: 高级远程控制器

package refactoring_guru.bridge.example.remotes;import refactoring_guru.bridge.example.devices.Device;public class AdvancedRemote extends BasicRemote {    public AdvancedRemote(Device device) {        super.device = device;
    }    public void mute() {        System.out.println("Remote: mute");        device.setVolume(0);
    }
}

Demo.java: 客户端代码

package refactoring_guru.bridge.example;import refactoring_guru.bridge.example.devices.Device;import refactoring_guru.bridge.example.devices.Radio;import refactoring_guru.bridge.example.devices.Tv;import refactoring_guru.bridge.example.remotes.AdvancedRemote;import refactoring_guru.bridge.example.remotes.BasicRemote;public class Demo {    public static void main(String[] args) {        testDevice(new Tv());        testDevice(new Radio());
    }    public static void testDevice(Device device) {        System.out.println("Tests with basic remote.");        BasicRemote basicRemote = new BasicRemote(device);        basicRemote.power();        device.printStatus();        System.out.println("Tests with advanced remote.");        AdvancedRemote advancedRemote = new AdvancedRemote(device);        advancedRemote.power();        advancedRemote.mute();        device.printStatus();
    }
}

OutputDemo.txt: 执行结果

Tests with basic remote.
Remote: power toggle
| I'm TV set.
| I'm enabled
| Current volume is 30%
| Current channel is 1
Tests with advanced remote.
Remote: power toggle
Remote: mute
| I'm TV set.
| I'm disabled
| Current volume is 0%
| Current channel is 1
Tests with basic remote.
Remote: power toggle
| I'm radio.
| I'm enabled
| Current volume is 30%
| Current channel is 1
Tests with advanced remote.
Remote: power toggle
Remote: mute
| I'm radio.
| I'm disabled
| Current volume is 0%
| Current channel is 1

以上是23种设计模式漫画版系列—桥接模式,全部内容了。

相关文章
|
9天前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
|
28天前
|
存储 Java
Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。
【10月更文挑战第19天】本文详细介绍了Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。HashMap以其高效的插入、查找和删除操作著称,而TreeMap则擅长于保持元素的自然排序或自定义排序,两者各具优势,适用于不同的开发场景。
42 1
|
24天前
|
XML 安全 Java
Java反射机制:解锁代码的无限可能
Java 反射(Reflection)是Java 的特征之一,它允许程序在运行时动态地访问和操作类的信息,包括类的属性、方法和构造函数。 反射机制能够使程序具备更大的灵活性和扩展性
35 5
Java反射机制:解锁代码的无限可能
|
20天前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
55 3
|
25天前
|
存储 安全 Java
系统安全架构的深度解析与实践:Java代码实现
【11月更文挑战第1天】系统安全架构是保护信息系统免受各种威胁和攻击的关键。作为系统架构师,设计一套完善的系统安全架构不仅需要对各种安全威胁有深入理解,还需要熟练掌握各种安全技术和工具。
70 10
|
21天前
|
分布式计算 Java MaxCompute
ODPS MR节点跑graph连通分量计算代码报错java heap space如何解决
任务启动命令:jar -resources odps-graph-connect-family-2.0-SNAPSHOT.jar -classpath ./odps-graph-connect-family-2.0-SNAPSHOT.jar ConnectFamily 若是设置参数该如何设置
|
19天前
|
Java
Java代码解释++i和i++的五个主要区别
本文介绍了前缀递增(++i)和后缀递增(i++)的区别。两者在独立语句中无差异,但在赋值表达式中,i++ 返回原值,++i 返回新值;在复杂表达式中计算顺序不同;在循环中虽结果相同但使用方式有别。最后通过 `Counter` 类模拟了两者的内部实现原理。
Java代码解释++i和i++的五个主要区别
|
27天前
|
搜索推荐 Java 数据库连接
Java|在 IDEA 里自动生成 MyBatis 模板代码
基于 MyBatis 开发的项目,新增数据库表以后,总是需要编写对应的 Entity、Mapper 和 Service 等等 Class 的代码,这些都是重复的工作,我们可以想一些办法来自动生成这些代码。
30 6
|
28天前
|
Java
通过Java代码解释成员变量(实例变量)和局部变量的区别
本文通过一个Java示例,详细解释了成员变量(实例变量)和局部变量的区别。成员变量属于类的一部分,每个对象有独立的副本;局部变量则在方法或代码块内部声明,作用范围仅限于此。示例代码展示了如何在类中声明和使用这两种变量。
|
29天前
|
存储 Java API
优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。
【10月更文挑战第19天】本文介绍了如何优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。内容包括Map的初始化、使用Stream API处理Map、利用merge方法、使用ComputeIfAbsent和ComputeIfPresent,以及Map的默认方法。这些技巧不仅提高了代码的可读性和维护性,还提升了开发效率。
56 3