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 方法,就可以看到输出 "红色的正方形" 和 "蓝色的圆形"。

相关推荐
间彧16 分钟前
Spring Secutiy基本原理及工作流程
java
数据智能老司机1 小时前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
Java水解1 小时前
JAVA经典面试题附答案(持续更新版)
java·后端·面试
数据智能老司机2 小时前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构
洛小豆3 小时前
在Java中,Integer.parseInt和Integer.valueOf有什么区别
java·后端·面试
前端小张同学4 小时前
服务器上如何搭建jenkins 服务CI/CD😎😎
java·后端
ytadpole4 小时前
Spring Cloud Gateway:一次不规范 URL 引发的路由转发404问题排查
java·后端
华仔啊4 小时前
基于 RuoYi-Vue 轻松实现单用户登录功能,亲测有效
java·vue.js·后端
程序员鱼皮5 小时前
刚刚 Java 25 炸裂发布!让 Java 再次伟大
java·javascript·计算机·程序员·编程·开发·代码