设计模式之 桥接模式

news/2024/11/26 3:24:52/

桥接模式(Bridge Pattern)是一种结构型设计模式,其核心思想是将抽象部分和实现部分分离,使它们可以独立地变化。通过桥接模式,抽象部分和实现部分可以独立扩展,从而避免了继承层次过深和高耦合的问题。

桥接模式的目标是将抽象和实现解耦,使得二者可以独立变化。这个模式的实现通过引入一个桥接接口,使得抽象部分通过该接口与具体实现部分连接。

一、桥接模式的结构

桥接模式的结构主要由以下几个角色组成:

  1. 抽象类(Abstraction)

    • 这个类定义了高层的接口,它包含一个对实现部分(Implementor)的引用。抽象类可以包含一些具体的方法,也可以是一个纯粹的抽象类。
  2. 扩展抽象类(RefinedAbstraction)

    • 这个类是抽象类的子类,它可以在抽象类的基础上扩展一些功能,具体实现由实现类(ConcreteImplementor)提供。
  3. 实现类接口(Implementor)

    • 这是一个接口或抽象类,定义了所有实现类需要实现的方法。实现类提供了具体的功能。
  4. 具体实现类(ConcreteImplementor)

    • 这是实现类接口的具体实现,定义了具体的操作方法。

二、桥接模式的工作原理

桥接模式的关键在于将抽象部分(如高级功能的接口)和实现部分(具体的操作或实现)分开,并通过接口桥接它们。这样就可以独立地修改抽象部分和实现部分,而不必牵连到另一部分。

具体来说:

  • 抽象部分是一个通用接口,它提供了对外部调用的高层功能。
  • 实现部分提供了低层次的具体实现,通常通过接口或抽象类来定义。
  • 两者通过桥接类连接,使得每一方都可以独立变化,避免了直接耦合和过度继承。

三、桥接模式的示例

示例:形状和颜色的桥接

假设我们有一个图形绘制系统,需要同时支持不同的形状(如圆形、方形)和不同的颜色(如红色、蓝色)。如果使用继承的话,可能会产生大量的子类,如红色圆形蓝色圆形红色方形蓝色方形等。而使用桥接模式,可以让形状和颜色的组合独立变化。

  • 抽象类(Abstraction)
    java">public abstract class Shape {protected Color color;public Shape(Color color) {this.color = color;}public abstract void draw();
    }
  • 扩展抽象类(RefinedAbstraction)
    java">public class Circle extends Shape{public Circle(Color color) {super(color);}@Overridepublic void draw() {System.out.println("画一个"+color.getColor()+"的圆");}
    }
    java">public class Oval extends Shape{public Oval(Color color) {super(color);}@Overridepublic void draw() {System.out.println("画一个"+color.getColor()+"的椭圆");}
    }
  • 实现类接口(Implementor)
    java">public interface Color {public String getColor();
    }
  • 具体实现类(ConcreteImplementor)
    java">public class Red implements Color{@Overridepublic String getColor() {return "红色";}
    }
    java">public class Blue implements Color{@Overridepublic String getColor() {return "蓝色";}
    }
  • 客户端代码(Client)
    java">public class Client {public static void main(String[] args) {Shape shape = new Circle(new Blue());shape.draw();}
    }
    
  • 运行结果

解释:

  • 在这个例子中,Shape类是一个抽象类,它定义了形状的通用接口(如draw方法),但具体的绘制行为是由颜色(Color接口)来决定的。
  • Circle类和Oval类是Shape的子类,它具体实现了draw方法。
  • Color接口和其具体实现类(如RedBlue)负责绘制颜色的具体操作。
  • 客户端通过传入不同的颜色实现类,可以轻松创建不同颜色的形状,而不需要修改形状的类。

四、桥接模式的优缺点

优点:
  1. 分离抽象和实现:

    抽象和实现分开,使得两者可以独立扩展。它们的变化不会影响到彼此,遵循了开闭原则(对扩展开放,对修改封闭)。
  2. 灵活性和可扩展性:

    桥接模式通过将功能实现与抽象解耦,使得在系统中添加新功能时,不必修改已有的代码。
  3. 减少了类的继承层次:

    传统的继承结构往往会导致继承层次过深,而桥接模式通过组合代替继承,使得类的层次结构更加清晰简洁。
  4. 避免了高耦合:

    通过桥接接口,抽象部分和实现部分相互解耦,从而减少了耦合,提高了系统的灵活性。
缺点:
  1. 增加了系统的复杂性:

    桥接模式需要定义多个接口和类,可能会导致系统的设计和实现更加复杂。
  2. 多了一个抽象层:

    增加了额外的抽象层,在一些简单的场景下可能显得冗余。

五、桥接模式的应用场景

桥接模式特别适用于以下几种情况:

  1. 系统需要在多个维度上进行扩展时:

    当系统中有多个维度需要变化(例如,操作系统和设备的组合),如果直接使用继承,可能会导致类的数量急剧增加,继承层次过深。此时可以使用桥接模式,通过组合来处理多个维度的变化。
  2. 抽象和实现部分可以独立变化时:

    如果需要分别对抽象和实现进行扩展(例如,不同的图形形状和不同的绘制方式),桥接模式可以帮助将它们分离开来,并分别进行扩展。
  3. 需要提供多个不同实现方式的接口时:

    例如,不同的数据库和查询接口可以通过桥接模式实现,数据库的连接方式和查询方式可以独立地变化。


http://www.ppmy.cn/news/1549972.html

相关文章

#渗透测试#SRC漏洞挖掘#网络运维# 黑客脚本编写终章之重定向与脚本调用

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…

【贪心算法】贪心算法四

贪心算法四 1.最长回文串2.增减字符串匹配3.分发饼干4.最优除法 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃😃 1.最长回文串 题目链接&…

Flutter将应用打包发布到App Store

使用Flutter将应用打包发布到App Store的详细步骤及流程图: 流程图 #mermaid-svg-X09iOP2FtRxwKsWw {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-X09iOP2FtRxwKsWw .error-icon{fill:#552222;}#mermai…

IDEA+Docker一键部署项目SpringBoot项目

文章目录 1. 部署项目的传统方式2. 前置工作3. SSH配置4. 连接Docker守护进程5. 创建简单的SpringBoot应用程序6. 编写Dockerfile文件7. 配置远程部署7.1 创建配置7.2 绑定端口7.3 添加执行前要运行的任务 8. 部署项目9. 开放防火墙的 11020 端口10. 访问项目11. 可能遇到的问题…

C语言练习.if.else语句.strstr

今天在做题之前&#xff0c;先介绍一下&#xff0c;新学到的库函数strstr 想要使用它&#xff0c;要先给它一个头文件<string.h> char *strstr(const char*str1,const char*str2); 首先&#xff1a;1.strstr的返回值是char&#xff0c;字符类型的。 2.两个实参&#xff…

2025-2026财年美国CISA国际战略规划(下)

文章目录 前言四、加强综合网络防御&#xff08;一&#xff09;与合作伙伴共同实施网络防御&#xff0c;降低集体风险推动措施有效性衡量 &#xff08;二&#xff09;大规模推动标准和安全&#xff0c;以提高网络安全推动措施有效性衡量 &#xff08;三&#xff09;提高主要合作…

k8s1.30.0高可用集群部署

负载均衡 nginx负载均衡 两台nginx负载均衡 vim /etc/nginx/nginx.conf stream {upstream kube-apiserver {server 192.168.0.11:6443 max_fails3 fail_timeout30s;#server 192.168.0.12:6443 max_fails3 fail_timeout30s;#server 192.168.0.13:6443 max_fails3…

如何在 .gitignore 中仅保留特定文件:以忽略文件夹中的所有文件为例

在日常的开发工作中&#xff0c;使用 Git 来管理项目是不可或缺的一部分。项目中的某些文件夹可能包含大量的临时文件、生成文件或不需要版本控制的文件。在这种情况下&#xff0c;我们通常会使用 .gitignore 文件来忽略这些文件夹。然而&#xff0c;有时我们可能希望在忽略整个…