• 桥接模式(结构型)


    目录

    一、前言

    二、桥接模式

    三、总结


    一、前言

            桥接模式(Bridge Pattern)是一种常用的设计模式,它可以将抽象部分与它的实现部分分离,使它们可以独立地变化。桥接模式通常用于需要在多个维度上扩展一个类的情况,或者需要避免在抽象和实现之间存在固定的绑定关系的情况。

            桥接模式的核心思想是将抽象部分和实现部分分离出来,使它们可以独立地变化。在桥接模式中,抽象部分和实现部分通过一个桥接接口连接在一起,这个接口允许抽象部分和实现部分之间的交互。这种分离的好处在于,它可以使系统更加灵活和可扩展,因为抽象部分和实现部分可以独立地变化,而不会对客户端代码产生影响。

    二、桥接模式

            比如我们有个需求制作服装,现在需要制作长袖,颜色有红色、绿色,这时候需要两个类,一个长袖红色、一个长袖绿色;后期有新需求,又要增加短袖制作,这时候就需要长袖红色、长袖绿色、短袖红色、短袖绿色;假设后期再增加一个颜色,就又需要增加两个类,如此下来,当种类和颜色等增加,增加的类就很多,如果利用桥接模式,就能减少类的增加。比如有类型:长袖、短袖;颜色:红色、绿色;尺码:L、M码,则根据桥接模式有类图:

            从类图可以看出,如果有新的增加,只需要再增加一个对应类即可。

            首先定义实现,提供基本操作的接口:

    1. /**
    2. * 颜色实现
    3. */
    4. public interface ColorApi {
    5. void paint();
    6. }
    1. /**
    2. * 尺码实现
    3. */
    4. public interface SizeApi {
    5. void size();
    6. }

            再定义具体实现:

    1. public class GreenApi implements ColorApi{
    2. @Override
    3. public void paint() {
    4. System.err.print("绿色->");
    5. }
    6. }
    1. public class RedApi implements ColorApi{
    2. @Override
    3. public void paint() {
    4. System.err.print("红色->");
    5. }
    6. }
    1. public class LApi implements SizeApi{
    2. @Override
    3. public void size() {
    4. System.err.println("L码");
    5. }
    6. }
    1. public class MApi implements SizeApi{
    2. @Override
    3. public void size() {
    4. System.err.println("M码");
    5. }
    6. }

            定义抽象类,包含对实现接口的引用:

    1. public abstract class TypeApi {
    2. protected ColorApi colorApi;
    3. protected SizeApi sizeApi;
    4. public void setSpecification(ColorApi colorApi, SizeApi sizeApi){
    5. this.colorApi = colorApi;
    6. this.sizeApi = sizeApi;
    7. }
    8. public abstract void type();
    9. }

            扩展抽象,抽象类的子类或具体实现类:

    1. public class LongType extends TypeApi{
    2. @Override
    3. public void type() {
    4. System.err.print("长袖->");
    5. colorApi.paint();
    6. sizeApi.size();
    7. }
    8. }
    1. public class ShortType extends TypeApi{
    2. @Override
    3. public void type() {
    4. System.err.print("短袖->");
    5. colorApi.paint();
    6. sizeApi.size();
    7. }
    8. }

            客户类:

    1. public class BridgeClient {
    2. public static void main(String[] args) {
    3. TypeApi longType = new LongType();
    4. longType.setSpecification(new RedApi(), new LApi());
    5. longType.type();
    6. TypeApi shortType = new ShortType();
    7. shortType.setSpecification(new GreenApi(), new MApi());
    8. shortType.type();
    9. }
    10. }

            运行结果:

    三、总结

            其中几个关键角色定义:

    • 抽象(Abstraction):定义抽象接口,通常包含对实现接口的引用。
    • 扩展抽象(Refined Abstraction):对抽象的扩展,可以是抽象类的子类或具体实现类。
    • 实现(Implementor):定义实现接口,提供基本操作的接口。
    • 具体实现(Concrete Implementor):实现实现接口的具体类。

            优点与缺点:

    优点:

    实现抽象和实现的分离
    桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统
    桥接模式有时类似于多继承方案,但是多继承方案违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差,而且多继承结构中类的个数非常庞大,桥接模式是比多继承方案更好的解决方法
    缺点:

    桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
    桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。

            使用场景:

    1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。

    2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。

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

  • 相关阅读:
    yolov5、yolov7-火焰识别项目实战
    大恒IFrameData & IImageData转bmp & HObject & Mat
    网站代码要点解析
    es6的新东西
    算法探索-切面条(CSDN算法技能树第一题)
    时间序列(四):单变量时间序列的神经网(LSTM)
    Python - flask后端开发笔记
    【Vue + Koa 前后端分离项目实战5】使用开源框架==>快速搭建后台管理系统 -- part5 后端实现最新期刊列表管理【增删查改】
    18.9k star!一个高性能的嵌入式分析型数据库,主要用于数据分析和数据处理任务
    docker系列(7) - Dockerfile
  • 原文地址:https://blog.csdn.net/qq_41061437/article/details/134371841