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种设计模式漫画版系列—桥接模式,全部内容了。

相关文章
|
2月前
|
Java
在Java中实现接口的具体代码示例
可以根据具体的需求,创建更多的类来实现这个接口,以满足不同形状的计算需求。希望这个示例对你理解在 Java 中如何实现接口有所帮助。
92 38
|
15天前
|
安全 Java 编译器
深入理解Java中synchronized三种使用方式:助您写出线程安全的代码
`synchronized` 是 Java 中的关键字,用于实现线程同步,确保多个线程互斥访问共享资源。它通过内置的监视器锁机制,防止多个线程同时执行被 `synchronized` 修饰的方法或代码块。`synchronized` 可以修饰非静态方法、静态方法和代码块,分别锁定实例对象、类对象或指定的对象。其底层原理基于 JVM 的指令和对象的监视器,JDK 1.6 后引入了偏向锁、轻量级锁等优化措施,提高了性能。
41 3
|
2月前
|
Java
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
58 24
|
23天前
|
前端开发 Java 测试技术
java日常开发中如何写出优雅的好维护的代码
代码可读性太差,实际是给团队后续开发中埋坑,优化在平时,没有那个团队会说我专门给你一个月来优化之前的代码,所以在日常开发中就要多注意可读性问题,不要写出几天之后自己都看不懂的代码。
57 2
|
1月前
|
Java 编译器 数据库
Java 中的注解(Annotations):代码中的 “元数据” 魔法
Java注解是代码中的“元数据”标签,不直接参与业务逻辑,但在编译或运行时提供重要信息。本文介绍了注解的基础语法、内置注解的应用场景,以及如何自定义注解和结合AOP技术实现方法执行日志记录,展示了注解在提升代码质量、简化开发流程和增强程序功能方面的强大作用。
82 5
|
1月前
|
存储 算法 Java
Java 内存管理与优化:掌控堆与栈,雕琢高效代码
Java内存管理与优化是提升程序性能的关键。掌握堆与栈的运作机制,学习如何有效管理内存资源,雕琢出更加高效的代码,是每个Java开发者必备的技能。
58 5
|
2月前
|
Java API 开发者
Java中的Lambda表达式:简洁代码的利器####
本文探讨了Java中Lambda表达式的概念、用途及其在简化代码和提高开发效率方面的显著作用。通过具体实例,展示了Lambda表达式如何在Java 8及更高版本中替代传统的匿名内部类,使代码更加简洁易读。文章还简要介绍了Lambda表达式的语法和常见用法,帮助开发者更好地理解和应用这一强大的工具。 ####
|
2月前
|
Java API Maven
商汤人像如何对接?Java代码如何写?
商汤人像如何对接?Java代码如何写?
51 5
|
1月前
|
安全 Java API
Java中的Lambda表达式:简化代码的现代魔法
在Java 8的发布中,Lambda表达式的引入无疑是一场编程范式的革命。它不仅让代码变得更加简洁,还使得函数式编程在Java中成为可能。本文将深入探讨Lambda表达式如何改变我们编写和维护Java代码的方式,以及它是如何提升我们编码效率的。
|
2月前
|
Java
Java将OffsetDateTime格式化为 yyyy-MM-dd HH:mm:ss 如何写代码?
Java将OffsetDateTime格式化为 yyyy-MM-dd HH:mm:ss 如何写代码?
41 0