• 设计模式-桥接模式(Bridge)


    前言

    桥接模式(Bridge Pattern)是一种结构型设计模式,用于将抽象部分和实现部分分离,使它们可以独立地变化。这种分离允许你将一个类的功能层次结构(抽象)与另一个类的实现层次结构(实现)分开,从而在不同层次上进行修改和扩展。在本篇博客中,我们将详细介绍桥接模式的概念,然后提供一个Java代码示例来演示如何实现它。

    一、桥接模式的概念

    桥接模式的核心思想是将一个类的抽象部分与其实现部分分离开来,使它们可以独立地变化。在桥接模式中,抽象部分包括一个抽象类(或接口),它定义了抽象方法,而实现部分包括具体的实现类,它实现了抽象类中的方法。

    桥接模式的结构包括以下要素:

    1. 抽象部分(Abstraction):定义抽象类(或接口),并包含一个对实现部分的引用。抽象部分定义了抽象方法,描述了客户端调用的接口。

    2. 扩展抽象部分(Refined Abstraction):扩展抽象部分,可以添加更多的方法或属性,对抽象部分进行更多的定制。

    3. 实现部分(Implementor):定义实现部分的接口,通常包括抽象方法。实现部分提供了具体实现,可以有多个不同的实现类。

    4. 具体实现部分(Concrete Implementor):实现实现部分的具体类,实现了实现部分的接口。

    二、桥接模式的实现

    让我们通过一个简单的示例来演示桥接模式的实现。我们将创建一个图形绘制应用程序,其中包括抽象图形和实际绘制引擎的桥接。

    首先,我们定义抽象图形类 Shape 和绘制引擎接口 DrawingAPI

    // 抽象图形类
    abstract class Shape {
        protected DrawingAPI drawingAPI;
    
        protected Shape(DrawingAPI drawingAPI) {
            this.drawingAPI = drawingAPI;
        }
    
        public abstract void draw();
    }
    
    // 绘制引擎接口
    interface DrawingAPI {
        void drawCircle(int x, int y, int radius);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    然后,我们创建具体的图形类 Circle 和实现引擎类 DrawingAPI1

    // 具体图形类
    class Circle extends Shape {
        private int x, y, radius;
    
        public Circle(int x, int y, int radius, DrawingAPI drawingAPI) {
            super(drawingAPI);
            this.x = x;
            this.y = y;
            this.radius = radius;
        }
    
        public void draw() {
            drawingAPI.drawCircle(x, y, radius);
        }
    }
    
    // 实现引擎类 1
    class DrawingAPI1 implements DrawingAPI {
        public void drawCircle(int x, int y, int radius) {
            System.out.printf("API1.circle at %d:%d radius %d%n", x, y, radius);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    接下来,我们创建另一个实现引擎类 DrawingAPI2

    // 实现引擎类 2
    class DrawingAPI2 implements DrawingAPI {
        public void drawCircle(int x, int y, int radius) {
            System.out.printf("API2.circle at %d:%d radius %d%n", x, y, radius);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    最后,我们编写客户端代码来测试桥接模式:

    public class BridgePatternDemo {
        public static void main(String[] args) {
            DrawingAPI api1 = new DrawingAPI1();
            DrawingAPI api2 = new DrawingAPI2();
    
            Shape circle1 = new Circle(1, 2, 3, api1);
            Shape circle2 = new Circle(5, 7, 11, api2);
    
            circle1.draw();
            circle2.draw();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这个示例中,我们创建了两个不同的绘制引擎 DrawingAPI1DrawingAPI2,以及两个不同的圆形图形 `Circle

    三、桥接模式的优缺点

    桥接模式(Bridge Pattern)是一种有助于将抽象部分和实现部分分离的设计模式,它有一些明显的优点和一些潜在的缺点。让我们首先讨论一下桥接模式的优点:

    1、优点:

    1. 分离抽象和实现:桥接模式通过将抽象部分和实现部分分离,使它们可以独立变化。这提高了系统的灵活性,允许你对它们进行独立的扩展和修改。

    2. 可扩展性:你可以轻松地扩展抽象部分和实现部分,而不必修改已有的代码。这使得你可以根据需要添加新的抽象或实现类,而无需改变现有代码。

    3. 可维护性:分离抽象和实现部分使代码更清晰,易于理解和维护。每个部分都有自己的接口,便于理解其功能和责任。

    4. 多维度变化:桥接模式允许多维度的变化,既可以扩展抽象部分,也可以扩展实现部分。这种组合可以产生多样化的对象组合,使得系统更加灵活。

    5. 隐藏细节:客户端不需要了解实现细节,只需与抽象接口交互。这有助于隐藏复杂性和细节,使客户端代码更简洁。

    2、缺点:

    1. 增加复杂性:桥接模式引入了抽象部分和实现部分之间的间接性,可能会增加系统的复杂性。对于简单的情况,使用桥接模式可能会显得过于繁琐。

    2. 适用性限制:桥接模式主要用于处理抽象和实现之间的多维度变化。对于单一维度的变化,可能会显得过于繁重。

    3. 增加类的数量:桥接模式通常需要创建多个抽象类和实现类,这可能会导致类的数量增加。在小型项目中,这可能不是一个问题,但在大型项目中需要谨慎考虑。

    4. 设计的抽象程度:确定抽象和实现的划分和接口设计需要一定的经验和抽象能力。不恰当的设计可能导致模式失效或增加不必要的复杂性。

    总的来说,桥接模式是一种有助于解决多维度变化的设计模式,它提供了灵活性和可维护性,但也需要权衡复杂性和适用性。在设计中,应根据具体的需求和情况来决定是否使用桥接模式。

  • 相关阅读:
    第五章 MyBais插件
    毛球修剪器方案开发的工作原理和构成
    chatGPT培训老师AIGC培训讲师叶梓:大模型这么火,我们在使用时应该关注些什么?-6
    HTML学生个人网站作业设计:公益专题扫黑除恶(HTML+CSS)
    spring管理bean
    【Rust日报】2022-11-01 async-backtrace 发布
    特殊类的设计
    进阶版JavaScript学习-第三期
    Win11无法将值写入注册表项如何解决?
    【Make YOLO Great Again】YOLOv1-v7全系列大解析(Tricks篇)
  • 原文地址:https://blog.csdn.net/yanghezheng/article/details/132790299