13.从桥接模式细品人生的几座桥

news2025/1/15 17:08:45

“物理学不存在了,今后也不会存在。”——《三体》
在这里插入图片描述

在《三体》中,有这样一个桥段,顶级的物理学家杨冬在三体文明超级计算机“智子”的干扰和误导下,得出了物理实验的结果在实验之前就会被某种力量确定的结论,导致自己主观上信念崩塌,亲手结束了自己年轻的生命。
笔者在读到这段时除了感叹大刘构思的精妙外,也深深的体会到了坚定的信念对人重要性。其实我们在某个时刻都是杨冬,她因物理现象的难以理解而崩溃,我们因问题的极度复杂化而迷茫。
这种时候,或许应该停下来仔细想想是不是方向上出了问题,而不是一味的蛮干,以一个杠精的心态在错误的路上越走越远。


一言

桥接模式基于类的最小设计原则,将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变。


设计实验室

如果我现在说,我们需要设计一个电商网站,你的任务是管理好电商网站中的商品品类,你有什么思路?
在这里插入图片描述

以手机为例,我们上架的品牌有:华为、小米、VIVO,主流的手机类型可能有折叠屏、曲面屏。


反骨乍现

“太简单了,我来!”
一位自诩有多年开发经验的反骨仔站了起来,开始单向输出:“我的思路是这样的,将手机先按屏幕材质分,之后每个屏幕材质下面再去分品牌,大家可以看我画的思维导图理解下。在实现上,我们可以…”
在这里插入图片描述
旁听的设计师越听眉头越紧,终于打断了反骨仔的发言:“抱歉,打断下,我不认为这个是可行的实现方案,这个方案存在着重大的隐患。”
然而反骨仔刚愎自用,狭隘的认为新来的设计师是在挑战自己这个老员工的权威,而且对于自己的方案极度自信。终于,公司还是决定由这位资深的老员工领头开始这个项目。
于是整个项目便按着维度嵌套的关系启动了开发。
在这里插入图片描述
问题很快到了致命的程度,手机的品类越来越丰富,屏幕材质也越来越多样,甚至颜色、受众、配置等等一系列的维度还没有加进来。反骨仔的设计引发了类爆炸,非常不利于扩展。

反骨仔依然没有放弃,他坚持要继续写下去,就像三体中挣扎的杨冬一样。只不过杨冬选择极端的逃离,他选择极端的冲锋。

难道现在我们遇到了困难就要退缩吗?工作量激增怎么了?我可以加班,我可以停休,我一定要把项目按我的思路完成。现在开始,所有成员跟我一起加班!

他开始振臂高呼,他开始声嘶力竭,他开始自我感动,但他从没有自我怀疑…
有时候勤奋并不是勤奋,而是在还设计阶段偷懒的债。方向错了,执行的再努力也是徒劳。千万不要用自以为是的勤奋感动自己。


桥接模式力挽狂澜

当初旁听时被禁言的设计师终于被允许开口了。
“或许我们可以用桥接模式试试接手这个问题,把抽象与行为实现剥离开,从而保证各部分的独立性以及它们对于各自部分的扩展”
在这里插入图片描述


代码实现

品牌接口

public interface Brand {
    void open();
    void close();
    void call();
}

品牌实现

class Vivo implements Brand{
    @Override
    public void open() {
        System.out.println("Vivo手机开机");
    }
    @Override
    public void close() {
        System.out.println("Vivo手机关机");
    }
    @Override
    public void call() {
        System.out.println("Vivo手机打电话");
    }
}
class Mi implements Brand{
    @Override
    public void open() {
        System.out.println("小米手机开机");
    }
    @Override
    public void close() {
        System.out.println("小米手机关机");
    }
    @Override
    public void call() {
        System.out.println("小米手机打电话");
    }
}

手机抽象

public abstract class Phone {
    private Brand brand;
    public Phone(Brand brand) {
        this.brand = brand;
    }
    protected void open(){
        this.brand.open();
    }
    protected void close(){
        this.brand.close();
    }
    protected void call(){
        this.brand.call();
    }
}

手机实现

class FoldedPhone extends Phone{
    public FoldedPhone(Brand brand) {
        super(brand);
    }
    public void open(){
        super.open();
        System.out.println("折叠手机");
    }
    public void close(){
        super.close();
        System.out.println("折叠手机");
    }
    public void call(){
        super.call();
        System.out.println("折叠手机");
    }
}

class UpRightPhone extends Phone{
    public UpRightPhone(Brand brand) {
        super(brand);
    }
    public void open(){
        super.open();
        System.out.println("翻盖手机");
    }
    public void close(){
        super.close();
        System.out.println("翻盖手机");
    }
    public void call(){
        super.call();
        System.out.println("翻盖手机");
    }
}

JDBC源码中的桥接模式

Jdbc 的 Driver接口,如果从桥接模式来看,Driver就是一个接口,它下面可以有MySQL的Driver,Oracle的Driver,这些就可以当做实现接口类。
在这里插入图片描述
这部分源码并没有硬搬桥接模式(按照桥接模式来说,DriverManager应该还有一些实现,而实际上并没有),客户端调用都是直接调用了DriverManager。这也恰恰说明设计模式其实并非是一成不变的八股文,优秀的架构设计者会在实际情况中对既定的设计思路做出调整。
在这里插入图片描述


实现抽象和实现部分的分离可以极大的提供系统的灵活性。让抽象部分和实现部分独立开来,这有助于系统进行分层设计,从而产生更好的结构化系统。
而对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了,其它的部分由具体业务来完成。
桥接模式替代多层继承方案,可以减少子类的个数,降低系统的管理和维护成本。但是它的引入也会增加系统的理解和设计难度。
由于聚合关联关系建立在抽象层,这就要求开发者针对抽象进行设计和编程。
同时,桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性。


关注我,共同进步,兔年最后一更,预祝大家新春快乐。——Wayne

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1432867.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Spring】代理模式

文章目录 代理模式对代理模式的理解静态代理动态代理JDK动态代理原理源码优化 CGLIB动态代理使用原理 JDK与CGLIB的对比 面试题JDK动态代理和CGLIB有什么区别?既然有没有接口都可以用CGLIB,为什么Spring还要使用JDK动态代理? 代理模式 对代理…

数据库管理phpmyadmin

子任务1-PHPmyadmin软件的使用 本子任务讲解phpmyadmin的介绍和使用操作。 训练目标 1、掌握PHPmyadmin软件的使用方法。 步骤1 phpMyAdmin 介绍 phpmyadmin是一个用PHP编写的软件工具,可以通过web方式控制和操作MySQL数据库。通过phpMyAdmin可以完全对数据库进行…

目标检测:2如何生成自己的数据集

目录 1. 数据采集 2. 图像标注 3. 开源已标记数据集 4. 数据集划分 参考: 1. 数据采集 数据采集是深度学习和人工智能任务中至关重要的一步,它为模型提供了必要的训练样本和测试数据。在实际应用中,数据采集的方法多种多样,每…

Linux网络通信——TCP/OSI七层模型/TCP/IP(五层或四层模型)/HTTP报文传输原理

文章目录 消息的传输什么是OSI七层模型OSI七层模型的内容物理层(Physical Layer):数据链路层(Data Link Layer):网络层(Network Layer):传输层(Transport Lay…

Docker基础与持续集成

docker 基础知识: docker与虚拟机 !左边为虚拟机,右边为docker环境 – Server :物理机服务器Host OS :构建的操作系统Hypervisor :一种虚拟机软件,装了之后才能虚拟化操作系统Guest OS :虚拟化的操作系统…

操作系统-01-Mac 苹果操作系统 Brew /端口占用

Brew brew 又叫 Homebrew,是 Mac OSX上的软件包管理工具。类似 ubuntu 中的 apt-get。 Install $ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"如下 houbinbindeMacBook-Pro:tools houbin…

机器学习系列——(十)支持向量机

一、背景 支持向量机(Support Vector Machine,SVM)是一种用于分类、回归和离群点检测等领域的监督学习方法。它最初由Vapnik和Cortes在1995年提出,被认为是机器学习领域中最成功的算法之一。 二、原理 2.1 线性SVM 我们先从最简…

django+flask网上购物商城系统的设计与实现python-vue

全球经济在快速的发展,中国更是进步飞速,这使得国内的互联网技术进入了发展的高峰时期,这让中外资本不断转向互联网这个大市场[3]。在这个信息高度发达的现在,利用网络进行信息管理改革已经成为了人们追捧的一种趋势。“网上购物系…

Qt案例 在对QGraphicsView视图修改和撤销修改图元操作时,使用命令模式实现。

当项目中有QGraphicsView视图直接修改图元的功能时,常会有CtriZ和CtrlY这种执行与撤销图元修改的功能,以便于在修改图元后能够进行一个还原/执行操作,此时就适合使用命令模式设计来实现这个功能。 以下示例在WINDOWS系统,Qt Creat…

【蓝桥杯冲冲冲】动态规划学习 [NOIP2003 提高组] 加分二叉树

【蓝桥杯冲冲冲】动态规划学习 [NOIP2003 提高组] 加分二叉树 蓝桥杯备赛 | 洛谷做题打卡day24 文章目录 蓝桥杯备赛 | 洛谷做题打卡day24[NOIP2003 提高组] 加分二叉树题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示数据规模与约定思路 题解代码我的一些话 [NOI…

MySQL如何实时同步数据到ES?试试阿里开源的Canal

前言 前几天在网上冲浪的时候发现了一个比较成熟的开源中间件—— Canal 。在了解了它的工作原理和使用场景后,顿时产生了浓厚的兴趣。今天,就让我们跟随我的脚步,一起来揭开它神秘的面纱吧。 目录 前言 简介 工作原理 MySQL主备复制…

两种方式实现文本超出指定行数显示展开收起...

需要实现这样一个功能 默认高度下文本超出隐藏&#xff0c;点击展开可查看所有内容&#xff0c;点击收起可折叠 方法一&#xff1a;通过html和css实现 代码部分 html:<div className"expand-fold"><input id"check-box" type"checkbox&qu…

(4)【Python数据分析进阶】Machine-Learning模型与算法应用-回归、分类模型汇总

线性回归、逻辑回归算法应用请参考: https://codeknight.blog.csdn.net/article/details/135693621https://codeknight.blog.csdn.net/article/details/135693621本篇主要介绍决策树、随机森林、KNN、SVM、Bayes等有监督算法以及无监督的聚类算法和应用PCA对数据进行降维的算法…

2024年生成式AI芯片市场规模将达500亿美元

1月24日&#xff0c;德勤发布《2024科技、传媒和电信行业预测》中文版报告&#xff0c;2024年是科技、传媒和电信行业关键的一年&#xff0c;不少科技公司正利用生成式AI升级软件和服务&#xff0c;预计今年全球生成式人工智能芯片销售额可能达到500亿美元以上。 2024年将有许…

量子计算帮助解锁对衰老和疾病的理解

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

初探unity中的ECS

ECS是一种软件架构模式&#xff0c;就像MVC一样。ECS最早在游戏《守望先锋》中提及到的相关链接。ECS具体是指实体&#xff08;entity&#xff09;、 组件&#xff08;component&#xff09;和系统&#xff08;system&#xff09;&#xff1a; 实体&#xff1a;实体是一个ID&a…

IDEA如何进行远程Debug调试(二)解决jar包运行报错的问题

一、解决jar包运行报错的问题 上文提到在进行debug远程调试的时候&#xff0c;打包后的jar包本地无法运行&#xff0c;报如下的错误 ​​​​​​​IDEA如何进行远程Debug调试-CSDN博客 查看报错是找不到对应的类&#xff0c;那么我们使用jd-gui的反编译工具&#xff0c;看看…

opencv中使用cuda加速图像处理

opencv大多数只使用到了cpu的版本&#xff0c;实际上对于复杂的图像处理过程用cuda&#xff08;特别是高分辨率的图像&#xff09;可能会有加速效果。是否需要使用cuda需要思考&#xff1a; 1、opencv的cuda库是否提供了想要的算子。在CUDA-accelerated Computer Vision你可以…

Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(三)

原文&#xff1a;Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第六章&#xff1a;决策树 决策树是多功能的机器学习算法&#xff0c;可以执行分类和回归任务&#xff0c;甚至多输出任务。它们…

Android BitmapShader setLocalMatrix缩放Bitmap高度重新onMeasure,Kotlin

Android BitmapShader setLocalMatrix缩放Bitmap高度重新onMeasure&#xff0c;Kotlin <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://sc…