Java设计模式之 -- 桥接模式

什么是桥接模式

桥接模式是一种结构型设计模式,也被称为"Handle/Body"。这种设计模式主要用于将抽象部分与它的实现部分分离,使它们可以独立地变化。这种方式有助于减少系统中的耦合性,增加了扩展性。

主要解决什么问题

桥接模式主要解决的是类的维度扩展问题。在一个多维度变化的类中,使用继承方式会导致类的数量急剧增加,而且增加新的维度也相对困难。而桥接模式能够将类的各个维度进行分离,独立扩展,降低类之间的耦合度。

在什么时候我们需要使用桥接模式

当你想要避免永久性地绑定某个抽象类与其实现时。

当类的抽象和实现都应该可以通过生成子类来扩展时。

当一个类的变化应该不依赖于它的实现变化,两者可以独立变化时。

生活中的应用实例

想象一下,你正在设计一个跨平台的视频播放器,支持Windows、Linux、Mac等多个操作系统,同时需要支持多种不同的视频格式,如MP4、AVI、MOV等。

如果使用继承来设计,那么需要为每个操作系统和视频格式的组合创建一个子类(例如:WindowsMP4Player、LinuxAVIPlayer等)。随着支持的操作系统和视频格式的增加,子类的数量会急剧增加。

如果采用桥接模式,可以将操作系统(抽象化)和视频格式(实现化)分离开来,分别扩展。这样只需要创建对应操作系统和视频格式的类,通过组合就可以得到我们想要的功能,大大减少了类的数量。

优点

分离抽象接口及其实现部分。

提高了系统的可扩展性,在两个方向上都可以独立扩展。

实现细节对客户透明,可以对用户隐藏实现细节。

缺点

增加了系统的理解和设计难度,需要理解如何分离抽象和实现。

需要正确识别出系统中两个独立变化的维度。

使用场景

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

当你希望在不影响客户端代码的情况下隐藏抽象的实现细节时。

代码示例

// 抽象化角色:颜色
interface Color {
    void bepaint(String shape);
}

// 实现化角色:红色
class RedColor implements Color {
    public void bepaint(String shape){
        System.out.println("红色的" + shape);
    }
}

// 实现化角色:蓝色
class BlueColor implements Color {
    public void bepaint(String shape){
        System.out.println("蓝色的" + shape);
    }
}

// 抽象化角色:形状
abstract class Shape {
    protected Color color;
    public Shape(Color color) {
        this.color = color;
    }
    public abstract void draw();
}

// 扩充抽象化角色:圆形
class Circle extends Shape {
    public Circle(Color color) {
        super(color);
    }
    public void draw() {
        color.bepaint("圆形");
    }
}

// 扩充抽象化角色:正方形
class Square extends Shape {
    public Square(Color color) {
        super(color);
    }
    public void draw() {
        color.bepaint("正方形");
    }
}

public class Client {
    public static void main(String[] args) {
        Color red = new RedColor();
        Shape square = new Square(red);
        square.draw();

        Color blue = new BlueColor();
        Shape circle = new Circle(blue);
        circle.draw();
    }
}

在这个示例中,Color 是实现化角色,RedColor 和 BlueColor 是具体实现化角色;Shape 是抽象化角色,Square 和 Circle 是扩充抽象化角色。Shape 中包含了一个 Color 的引用,形成了桥接。

当我们运行 main 方法,就可以看到输出 "红色的正方形" 和 "蓝色的圆形"。

相关推荐
爱上语文17 分钟前
Springboot的三层架构
java·开发语言·spring boot·后端·spring
serve the people20 分钟前
springboot 单独新建一个文件实时写数据,当文件大于100M时按照日期时间做文件名进行归档
java·spring boot·后端
qmx_071 小时前
HTB-Jerry(tomcat war文件、msfvenom)
java·web安全·网络安全·tomcat
为风而战1 小时前
IIS+Ngnix+Tomcat 部署网站 用IIS实现反向代理
java·tomcat
技术无疆3 小时前
快速开发与维护:探索 AndroidAnnotations
android·java·android studio·android-studio·androidx·代码注入
架构文摘JGWZ6 小时前
Java 23 的12 个新特性!!
java·开发语言·学习
拾光师7 小时前
spring获取当前request
java·后端·spring
aPurpleBerry7 小时前
neo4j安装启动教程+对应的jdk配置
java·neo4j
我是苏苏7 小时前
Web开发:ABP框架2——入门级别的增删改查Demo
java·开发语言
xujinwei_gingko7 小时前
Spring IOC容器Bean对象管理-Java Config方式
java·spring