设计模式-桥接模式

  • 类型:结构型
  • 目的:通过抽离出多个维度相互组合(聚合)来代替继承,简化系统。

话不多说,看个优化案例。

优化案例

现有系统中,对于画面窗口的边框有一套样式来控制是否有圆角。因为新的需求,需要增加两套样式,一套控制边框线条的颜色(红、黄、蓝),一套控制边框有无阴影。我们来看看几种实现方式。

我们看看用继承或实现的方式,会是什么样子。

public interface Style {
    void style();
}

public class Radius implements style {
    public void style() {
        radius();
    }

    protected void radius() {
        System.out.println("有边框圆角");
    }
}

public class RadiusRed extends Radius {
    public void style() {
        super.style();
        this.red();
    }

    protected void red() {
        System.out.println("红色边框");
    }
}

public class RadiusBlue extends Radius {
    public void style() {
        super.style();
        this.blue();
    }

    protected void blue() {
        System.out.println("蓝色边框");
    }
}

public class RadiusYellow extends Radius {
    public void style() {
        super.style();
        this.yellow();
    }

    protected void yellow() {
        System.out.println("黄色边框");
    }
}

public class RadiusRedShadow extends RadiusRed {
    public void style() {
        super.style();
        this.shadow();
    }

    protected void shadow() {
        System.out.println("有边框阴影");
    }
}

public class RadiusBlueShadow extends RadiusBlue {
    public void style() {
        super.style();
        this.shadow();
    }

    protected void shadow() {
        System.out.println("有边框阴影");
    }
}

public class RadiusYellowShadow extends RadiusYellow {
    public void style() {
        super.style();
        this.shadow();
    }

    protected void shadow() {
        System.out.println("有边框阴影");
    }
}

public class RadiusRedNotShadow extends RadiusRed {
    public void style() {
        super.style();
        this.shadow();
    }

    protected void shadow() {
        System.out.println("无边框阴影");
    }
}

public class RadiusBlueNotShadow extends RadiusBlue {
    public void style() {
        super.style();
        this.shadow();
    }

    protected void shadow() {
        System.out.println("无边框阴影");
    }
}

public class RadiusYellowNotShadow extends RadiusYellow {
    public void style() {
        super.style();
        this.shadow();
    }

    protected void shadow() {
        System.out.println("无边框阴影");
    }
}

public class NotRadius implements style {
    public void style() {
        radius();
    }

    protected void radius() {
        System.out.println("无边框圆角");
    }
}

public class NotRadiusRed extends NotRadius {
    public void style() {
        super.style();
        this.red();
    }

    protected void red() {
        System.out.println("红色边框");
    }
}

public class NotRadiusBlue extends NotRadius {
    public void style() {
        super.style();
        this.blue();
    }

    protected void blue() {
        System.out.println("蓝色边框");
    }
}

public class NotRadiusYellow extends NotRadius {
    public void style() {
        super.style();
        this.yellow();
    }

    protected void yellow() {
        System.out.println("黄色边框");
    }
}

public class NotRadiusRedShadow extends NotRadiusRed {
    public void style() {
        super.style();
        this.shadow();
    }

    protected void shadow() {
        System.out.println("边框阴影");
    }
}

public class NotRadiusBlueShadow extends NotRadiusBlue {
    public void style() {
        super.style();
        this.shadow();
    }

    protected void shadow() {
        System.out.println("边框阴影");
    }
}

public class NotRadiusYellowShadow extends NotRadiusYellow {
    public void style() {
        super.style();
        this.shadow();
    }

    protected void shadow() {
        System.out.println("边框阴影");
    }
}

public class NotRadiusRedNotShadow extends NotRadiusRed {
    public void style() {
        super.style();
        this.shadow();
    }

    protected void shadow() {
        System.out.println("无边框阴影");
    }
}

public class NotRadiusBlueNotShadow extends NotRadiusBlue {
    public void style() {
        super.style();
        this.shadow();
    }

    protected void shadow() {
        System.out.println("无边框阴影");
    }
}

public class NotRadiusYellowNotShadow extends NotRadiusYellow {
    public void style() {
        super.style();
        this.shadow();
    }

    protected void shadow() {
        System.out.println("无边框阴影");
    }
}

可以看出,使用实现或者继承的方式来构件模块所需的类的数量及其的庞大(21个)。写吐了,太多太繁琐了。
再看看客户端的使用方法。

public class Client {
    public static void main(String[] args) {
        Style style = new NotRadiusYellowNotShadow();
        style.style();
    }
}

客户端的使用还是比较简单的,但这并不能掩盖类的数量过多的问题。

那么除了这种方法,我们还有什么别的更好的办法可以实现吗?当然有了。

引入桥接模式,优化多维度继承问题。
首先,我们得分析这个模块。模块中有三种不同的维度(Radius, Color, Shadow),都是用来拓展 Style的。将三个维度都抽象成接口,并且将 Style定义为桥接类。我们看看新的代码。

public interface Radius {
    void radius();
}

public interface Color {
    void color();
}

public interface Shadow {
    void shadow();
}

public class HasRadius implements Radius {
    public void radius() {
        System.out.println("有边框圆角");
    }
}

public class HasNotRadius implements Radius {
    public void radius() {
        System.out.println("无边框圆角");
    }
}

public class Red implements Color {
    public void color() {
        System.out.println("红色边框");
    }
}

public class Yellow implements Color {
    public void color() {
        System.out.println("黄色边框");
    }
}

public class Blue implements Color {
    public void color() {
        System.out.println("蓝色边框");
    }
}

public class HasShadow implements Shadow {
    public void shadow() {
        System.out.println("有边框阴影");
    }
}

public class HasNotShadow implements Shadow {
    public void shadow() {
        System.out.println("无边框阴影");
    }
}

public class Style {
    private Radius radius;
    private Color color;
    private Shadow shadow;

    public Style(Radius radius, Color color, Shadow shadow) {
        this.radius = radius;
        this.color = color;
        this.shadow = shadow;
    }

    public void init() {
        radius.radius();
        color.color();
        shadow.shadow();
    }
}

类的数量急剧减少,而且如果三个维度中有新的 Style增加,也只需要在对应的维度增加新的实现类即可。即便增加新的维度,也只需要对应增加一套接口和实现类。最多在桥接类 Style中增加持有的接口对象即可(虽然不符合开闭原则)。

我们再来看看客户端的使用方法。

public class Client {
    public static void main(String[] args) {
        Style style = new Style(new HasRadius(), new Red(), new HasShadow());
        style.init();
    }
}

Style持有 RadiusColorShadow,并且根据构造时传入的具体实现动态的更改持有的具体实现。易用性上也有着提升。

Original: https://www.cnblogs.com/spoonb/p/16726589.html
Author: spoonb
Title: 设计模式-桥接模式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/685851/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Nginx服务的搭建与配置

    Nginx服务的搭建与配置 一、关闭防火墙并安装epel源 1、关闭selinux ①修改selinux的配置文件 [root@localhost ~]# vim /etc/sel…

    技术杂谈 2023年7月11日
    086
  • quartz框架(六)-ThreadPool

    本篇博文,博主将介绍Quartz框架中ThreadPool线程池相关的内容。线程池顾名思义,就是一个可以帮助我们来进行线程资源管理的对象。在web开发中,常见的就有数据库连接池,h…

    技术杂谈 2023年7月24日
    079
  • ssm整合

    <!– Spring –> <dependency> <groupid>org.springframework</groupid&gt…

    技术杂谈 2023年7月25日
    074
  • 如何将编写的c语言程序打包成exe可执行文件呢?

    如何将编写的c语言程序打包成exe可执行文件呢? 以前我们写程序很多是在编辑器上,让编辑起来编译运行我们的程序。如果想将其打包成exe可执行文件该如何做? 我这里推荐使用codeB…

    技术杂谈 2023年6月21日
    0129
  • sqli-labs-master/Less-1解题过程

    2.根据提示输入id的值如下(?id = key),发现id的值变化时,页面显示的内容也会变化 6.根据显示发现2,3可以显示出来,那么可以在2,3处进行database()和ve…

    技术杂谈 2023年6月21日
    0100
  • 浅谈分布式事务

    前言应用场景 事务必须满足传统事务的特性,即原子性,一致性,分离性和持久性。但是分布式事务处理过程中, 某些场地比如在电商系统中,当有用户下单后,除了在订单表插入一条记录外,对应商…

    技术杂谈 2023年5月31日
    070
  • n阶高精度乘法,(求高阶阶乘)

    include “stdio.h” include “string.h” define MAX 10000//结果最大位数,可以自行…

    技术杂谈 2023年7月24日
    082
  • 面经

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/langtianya/p/10873753.htmlAu…

    技术杂谈 2023年5月31日
    095
  • quartz框架(十)-QuartzSchedulerThread

    本篇博文,博主将介绍QuartzSchedulerThread的相关内容。话不多说,直接进入正题。 从源码和该类的名称上,QuartzSchedulerThread首先是一个线程类…

    技术杂谈 2023年7月24日
    068
  • JavaWeb知识梳理(可收藏)

    JavaWeb相关知识 1、Servlet 1.1 Status Code(Http状态码) 1、1xx 请求信息 Http状态码 Http Status Code Http状态码…

    技术杂谈 2023年6月21日
    0110
  • AJAX学习(1)

    基础确认:HTML、CSS、JavaScript AJAX可以: Ajax 的核心是 XMLHttpRequest 对象,用于和服务器交换数据。 xmlhttp.open(&quo…

    技术杂谈 2023年6月21日
    082
  • 4、Swift协程详解:结构化并发与TaskGroup

    TaskGroup 的基本用法 我们现在已经知道怎么在自己的程序里面调用异步函数了。 不难发现,调用异步函数的关键点是创建 Task 的实例。通过 Task 的构造器或者 deta…

    技术杂谈 2023年6月1日
    074
  • OpenCV-图像特征提取与描述

    OpenCV-图像特征提取与描述 1 角点特征 学习目标 理解图像的特征 知道图像的角点 1.1 图像的特征 大多数人都玩过拼图游戏。首先拿到完整图像的碎片,然后把这些碎片以正确的…

    技术杂谈 2023年6月1日
    063
  • 装了这几个IDEA插件,基本上一站式开发了!

    前言 前几天有社区小伙伴私聊我,问我都用哪些IDEA插件,我的IDEA的主题看起来不错。 作为一个开源作者,每周要code大量的代码,提升日常工作效率是我一直追求的,在众多的IDE…

    技术杂谈 2023年7月11日
    093
  • java.sql.SQLSyntaxErrorException: Unknown database报错

    一般是jdbc链接的数据库名字写错了,检查数据库的名字。 Original: https://www.cnblogs.com/333czh/p/15622694.htmlAutho…

    技术杂谈 2023年6月21日
    072
  • 微服务网关Gateway实践总结

    有多少请求,被网关截胡; 一、Gateway简介 微服务架构中,网关服务通常提供动态路由,以及流量控制与请求识别等核心能力,在之前的篇幅中有说过Zuul组件的使用流程,但是当下Ga…

    技术杂谈 2023年7月23日
    071
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球