结构设计模式 - 桥接设计模式 - JAVA

举报
神的孩子在歌唱 发表于 2024/06/16 23:12:54 2024/06/16
【摘要】 百度百科: 桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(interface)模式。说实话,一开始我没法理解百度百科这句话,所以我找了几个案例文章学习,那么,我就拿最经常看到的绘制不同颜色的形状这个案例去理解吧。以下是网上看到的案例注意:以下的案例是反例现在有一个需求,需要创建不同的图形,并且每个图形

桥接设计模式

前言

这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。

作者:神的孩子都在歌唱


一. 介绍

百度百科: 桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(interface)模式。


说实话,一开始我没法理解百度百科这句话,所以我找了几个案例文章学习,那么,我就拿最经常看到的 绘制不同颜色的形状 这个案例去理解吧。

以下是网上看到的案例

注意:以下的案例是反例

现在有一个需求,需要创建不同的图形,并且每个图形都有可能会有不同的颜色。我们可以利用继承的方式来设计类的关系:



image-20200207194617620

我们可以发现有很多的不同形状颜色的类,假如我们再增加一个形状或再增加一种颜色,就需要创建更多的类。

试想,在一个有多种可能会变化的维度的系统中,用继承方式会造成类爆炸,扩展起来不灵活。每次在一个维度上新增一个具体实现都要增加多个子类。为了更加灵活的设计系统。 我们此时可以考虑使用桥接模式, 将抽象与实现分离,使它们可以独立变化。。




个人理解:通过上面的反例,大概知道桥接模式具体要做什么了,它的理念其实就是将要实现对象的类 (比如Shape类)进行抽象化将颜色独立出来实现(比如 black,white颜色),使得抽象部分(Shape)实现部分(color)可以独立地扩展和变化,实现解耦


作用是了解了,但是为啥叫桥接模式呢?是不是我没理解透,这个取名有啥含义,有知道的大佬补充一下


二. 桥接模式示例

概念理解了,那么我们看看代码如何实现吧,假设我们需要绘制不同颜色的形状,使用桥接模式将形状和颜色解耦。

image-20200207194617620


2.1 定义实现部分和具体实现

color接口

/**
 * @author chenyunzhi
 * @date 2024/5/31 16:37
 * @Description 定义颜色的接口
 */
public interface Color {
    /**
     * 应用颜色
     */
    void applyColor();
}

BlackColor类

/**
 * @author chenyunzhi
 * @date 2024/5/31 17:01
 * @Description 黑色
 */
public class BlackColor implements Color{
    @Override
    public void applyColor() {
        System.out.println("黑色");
    }
}

WhiteColor类

/**
 * @author chenyunzhi
 * @date 2024/5/31 16:59
 * @Description 白色
 */
public class WhiteColor  implements Color{
    @Override
    public void applyColor() {
        System.out.println("白色");
    }
}

2.2 定义抽象部分和细化抽象部分

shape类

/**
 * @author chenyunzhi
 * @date 2024/5/31 17:02
 * @Description 定义形状的抽象接口
 */
abstract class Shape {
​
    protected Color color;
    public Shape(Color color) {
        this.color = color;
    }
​
    // 定义抽象画图方法
    abstract void draw();
}

Circle类

/**
 * @author chenyunzhi
 * @date 2024/5/31 17:07
 * @Description 圆形
 */
public class CircleShape extends Shape{
    public CircleShape(Color color) {
        super(color);
    }
​
    @Override
    void draw() {
        System.out.print("获得圆形的颜色是");
        color.applyColor();
    }
}

Rectangle类

/**
 * @author chenyunzhi
 * @date 2024/5/31 17:13
 * @Description 长方形
 */
public class RectangleShape extends Shape{
    public RectangleShape(Color color) {
        super(color);
    }
​
    @Override
    void draw() {
        System.out.print("获得长方形颜色是");
        color.applyColor();
    }
}


2.3 测试

/**
 * @author chenyunzhi
 * @date 2024/5/31 17:15
 * @Description
 */
public class BridgePatterTest {
    public static void main(String[] args) {
        CircleShape circleShape = new CircleShape(new BlackColor());
        circleShape.draw();
        RectangleShape rectangleShape = new RectangleShape(new WhiteColor());
        rectangleShape.draw();
    }
}

结果如下


image-20240531173030191

2.4 解释

  • 实现部分(Implementor)Color 接口及其具体实现 RedColorGreenColor,定义了颜色的应用方式。

  • 抽象部分(Abstraction)Shape 抽象类,包含一个对 Color 接口的引用,并定义了一个抽象的 draw 方法。

  • 细化抽象部分(Refined Abstraction)CircleRectangle 类,具体实现了 Shape 抽象类中的 draw 方法,调用 color.applyColor() 来应用颜色。


三. 结论

  1. 当抽象和实现都可以独立地具有不同的层次结构并且我们希望对客户端应用程序隐藏实现时,可以使用桥接设计模式。

  2. 桥接模式中的抽象部分主要是定义了对象的高层行为和属性,通过引用实现部分的接口,使得抽象部分和实现部分可以独立地扩展和变化。这样就实现了系统的解耦,提高了代码的灵活性和可维护性。


作者:神的孩子都在歌唱

本人博客:https://blog.csdn.net/weixin_46654114

转载说明:务必注明来源,附带本人博客连接。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。