设计模式(七)桥接模式详解

设计模式(七)桥接模式详解

桥接模式简介

  • 定义:桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使得它们可以独立变化。又被称之为柄体模式和接口模式。通过将抽象部分和实现部分解耦,桥接模式可以减少类的数量并提高系统的灵活性。

  • 主要用途:当类存在多个维度的变化时,可以使用桥接模式将这些变化分离,从而使各个维度可以独立变化。

桥接模式的关键组件

  1. Abstraction(抽象部分):定义了抽象部分的接口,并持有一个对实现部分的引用。

  2. RefinedAbstraction(扩展抽象部分):扩展了抽象部分,提供了更具体的实现。

  3. Implementor(实现部分接口):定义了实现部分的接口,具体实现类需要实现这个接口。

  4. ConcreteImplementor(具体实现部分):实现了实现部分接口,提供了具体的实现。

java 复制代码
// 品牌接口
package com.briup.patterns_design.bridge;

/**
 * @author 35329
 * 品牌
 */
public interface Brand {
    void info();
}
java 复制代码
// 联想品牌类
package com.briup.patterns_design.bridge;

/**
 * @author 35329
 * 联想品牌
 */
public class Lenovo implements Brand{
    @Override
    public void info() {
        System.out.print("联想");
    }
}
java 复制代码
// 苹果品牌类
package com.briup.patterns_design.bridge;

/**
 * @author 35329
 * 苹果品牌
 */
public class Apple implements Brand{
    @Override
    public void info() {
        System.out.print("苹果");
    }
}
java 复制代码
// 抽象的电脑类型类
package com.briup.patterns_design.bridge;

/**
 * @author 35329
 * 抽象的电脑类型类
 */
public abstract class Computer {
    // 组合,品牌 桥
    protected Brand brand;

    public Computer(Brand brand) {
        this.brand = brand;
    }

    public void info(){
        // 自带品牌
        brand.info();
   }
}

class Desktop extends Computer{

    public Desktop(Brand brand) {
        super(brand);
    }

    @Override
    public void info() {
        super.info();
        System.out.println("台式机");
    }
}
class Laptop extends Computer{

    public Laptop(Brand brand) {
        super(brand);
    }

    @Override
    public void info() {
        super.info();
        System.out.println("笔记本");
    }
}
java 复制代码
// 测试类
package com.briup.patterns_design.bridge;

/**
 * @author 35329
 */
public class Test {
    public static void main(String[] args) {
        // 苹果笔记本
        Computer computer = new Laptop(new Apple());
        computer.info();
        // 联想台式机
        Computer computer2 = new Desktop(new Lenovo());
        computer2.info();
    }
}

好处分析:

  • 桥接模式偶尔类似于多继承方案,但是多继承方案违背了类的单一职责原则,复用性比较差,类的个数也非常多,桥接模式是比多继承方案更好的解决方法。极大地减少了子类的个数,从而降低管理和维护的成本。

  • 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。符合开闭原则,就像一座桥,可以把两个维度连接起来。

劣势分析:

  • 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。

  • 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。

最佳实践:

  • 如果一个系统需要在构建的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。抽象化角色和实现化角色可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。

  • 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。

  • 虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统, 桥接模式尤为适用。

场景:

  • Java语言通过Java虚拟机实现了平台的无关性。

  • AWT中的Peer架构

  • JDBC驱动程序也是桥接模式的应用之一。

相关推荐
Crossoads42 分钟前
【汇编语言】端口 —— 「从端口到时间:一文了解CMOS RAM与汇编指令的交汇」
android·java·汇编·深度学习·网络协议·机器学习·汇编语言
老马啸西风43 分钟前
NLP 中文拼写检测纠正论文-02-2019-SOTA FASPell Chinese Spell Checke github 源码介绍
java
向宇it44 分钟前
【从零开始入门unity游戏开发之——C#篇26】C#面向对象动态多态——接口(Interface)、接口里氏替换原则、密封方法(`sealed` )
java·开发语言·unity·c#·游戏引擎·里氏替换原则
@菜鸟进阶记@1 小时前
java根据Word模板实现动态填充导出
java·开发语言
卖芒果的潇洒农民1 小时前
Lecture 6 Isolation & System Call Entry
java·开发语言
Amarantine、沐风倩✨2 小时前
设计一个监控摄像头物联网IOT(webRTC、音视频、文件存储)
java·物联网·音视频·webrtc·html5·视频编解码·七牛云存储
路在脚下@3 小时前
spring boot的配置文件属性注入到类的静态属性
java·spring boot·sql
森屿Serien3 小时前
Spring Boot常用注解
java·spring boot·后端
Damon_X3 小时前
桥接模式(Bridge Pattern)
设计模式·桥接模式
苹果醋34 小时前
React源码02 - 基础知识 React API 一览
java·运维·spring boot·mysql·nginx