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

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

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


一言

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


设计实验室

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

以手机为例,我们上架的品牌有:华为、小米、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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PyTorch 2.2 中文官方教程(九)

在生产环境中部署 PyTorch 模型 通过 Flask 在 Python 中部署 PyTorch 的 REST API 原文:pytorch.org/tutorials/intermediate/flask_rest_api_tutorial.html 译者:飞龙 协议:CC BY-NC-SA 4.0 注意 点击这里下载完整的示例代码 作者&#…

Windows鼠标右键菜单闪一下就没了?说不定是这个搞的鬼!

前言 这几天接到有些小伙伴反馈:Windows的右键菜单闪一下就没了。 本来是要按鼠标右键进行界面刷新或者新建文件夹等操作的,结果闪一下就没有了,感觉这个系统就好像中了病毒了一样。 相信很多小伙伴应该也遇到过同样的情况,但具…

BUGKU-WEB Simple_SSTI_1

02 Simple_SSTI_1 题目描述 解题思路 进入场景后&#xff0c;显示&#xff1a; You need pass in a parameter named flag。ctrlu 查看源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Simpl…

ElementUI 组件Layout布局 el-row和el-col 简介

Layout布局 el-row属性简介 el-row 组件 提供 gutter 属性来指定每一栏之间的间隔&#xff0c;默认间隔为 0。 提醒&#xff1a; el-row :gutter需要与el-col :span 一起使用才能生效 el-col属性简介 el-col的span属性 默认值为24&#xff0c;表示每一行共24份&#xff0c;:s…

030 可变参数

可变参数定义 public static void main(String[] args) {// 多参数方式传递System.out.println(max(1,3,5,3,6,1,2));// 数组方式传递System.out.println(max(new int[]{1,3,5,3,6,1,2})); }static int max(int... nums){int max Integer.MIN_VALUE;for (int num : nums) {if(…

Mysql架构系列——生产常用的高可用部署模式介绍

模式 高可用模式 Galera Cluster是由Codership开发的MySQL多主集群&#xff0c;包含在MariaDB中&#xff0c;同时支持Percona xtradb、MySQL&#xff0c;是一个易于使用的高可用解决方案&#xff0c;在数据完整性、可扩展性及高性能方面都有可接受的表现。 将会基于Galera C…

三层交换组网实验(华为)

思科设备参考&#xff1a;三层交换组网实验&#xff08;思科&#xff09; 一&#xff0c;技术简介 三层交换技术的出现&#xff0c;解决子网必须依赖路由器进行管理的问题&#xff0c;解决传统路由器低速、复杂所造成的网络瓶颈问题。一个具有三层交换功能的设备可简单理解为…

2.4日总结

第一题&#xff1a;选数 题解&#xff1a;思路还是很简单的&#xff0c;只需要想清楚dfs里的函数都是什么就可以了&#xff0c;还有一个简单的判断素数的函数&#xff0c;这题真没啥难度&#xff0c;就是属于基础题吧&#xff0c;请看AC代码 #include <stdio.h> #includ…

redis的缓存击穿和缓存雪崩和缓存穿透问题解决方法

Redis的缓存击穿&#xff1a; 热点的key&#xff0c;在不停的扛着大并发&#xff0c;当这个key失效时&#xff0c;一瞬间大量的请求冲到持久层的数据库中&#xff0c;就像在一堵墙上某个点凿开了一个洞&#xff01; 解决方法&#xff1a; 1.热点key永不过期&#xff1a; 统计访…

Facebook的数字合作愿景:创新与未来发展

随着科技的飞速发展&#xff0c;Facebook一直处于数字创新的前沿&#xff0c;致力于构建开放、智能、社交的数字社交体验。本文将深入探讨Facebook的数字合作愿景&#xff0c;探索其在创新与未来发展方面的雄心壮志。 引言 在当今数字化时代&#xff0c;社交媒体不仅是人们沟通…

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

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

Stable Diffusion 模型下载:EnvyHyperrealXL01

模型介绍 一个基于 EnvyHyperdrive 和 NewReality 的超写实模型&#xff0c;使生成的照片级真实感模型在主题和视觉上与我的其他模型相似&#xff0c;除了&#xff0c;你知道&#xff0c;照片级真实感。 &#x1f603; 条目内容类型大模型基础模型SDXL 1.0来源CIVITAI作者_En…

SpinrgBoot-Mybatis基础

​ JDBCMyBatis概述MyBatis基础应用MyBatis动态标签 一、JDBC( Java DataBase Connectivity )&#xff1a;Java连接数据库的解决方案 概念&#xff1a;JDBC就是Java后端操作数据库的解决方案&#xff0c;操作数据的指令应该来自于前端&#xff0c;前端把数据提交到后端Java代…

CHS_09.2.3.6_2+多生产者-多消费者

CHS_09.2.3.6_2多生产者-多消费者 问题描述问题分析如何实现如何实现假如我们把盘子的容量设为二知识回顾 在这个小节中 我们会学习一个多生产者 多消费者的这样一个问题模型 问题描述 先来看一下问题的描述 假设桌子上面有一个盘子 每次只能向这个盘子里放一个水果 有四个人…

搜索专项---Flood Fill

文章目录 池塘计数城堡问题山峰与山谷 一、池塘计数OJ链接 1.BFS做法 #include <bits/stdc.h>#define x first #define y secondtypedef std::pair<int,int> PII;constexpr int N1010;int n,m; char g[N][N]; bool st[N][N];//用来表示已经记录过的 std::queue&…

3D力导向树插件-3d-force-graph学习002

一、实现效果&#xff1a;节点文字同时展示 节点显示不同颜色节点盒label文字并存节点上添加点击事件 二、利用插件&#xff1a;CSS2DRenderer 提示&#xff1a;以下引入文件均可在安装完3d-force-graph的安装包里找到 三、关键代码 提示&#xff1a;模拟数据可按如下格式填…

笔记---容斥原理

AcWing,890.能被整除的数 给定一个整数 n n n 和 m m m 个不同的质数 p 1 , p 2 , … , p m p_{1},p_{2},…,p_{m} p1​,p2​,…,pm​。 请你求出 1 ∼ n 1∼n 1∼n 中能被 p 1 , p 2 , … , p m p_{1},p_{2},…,p_{m} p1​,p2​,…,pm​ 中的至少一个数整除的整数有多少…

SemiDrive E3 MCAL 开发系列(1) – 环境搭建

一、 概述 本文将会介绍 SemiDrive E3 系列 MCU 的MCAL 开发环境搭建&#xff0c;包括如何获取及安装 EB 和 MCAL&#xff0c;E3 Gateway 开发板介绍&#xff0c;MCAL 工程的编译、下载等。 二、 EB 和 MCAL 的获取及安装 2.1 软件获取 EB Tresos 是用于进行 MCAL 配置…

Android Split APK介绍

文章目录 Split APKSplit APK 详细介绍概念Android App Bundle&#xff08;AAB&#xff09;Split APK 的优势动态分发减小安装包大小模块化和渠道分发 Split APK 的类型基于屏幕密度### 基于 CPU 架构基于语言 实现 Split APK Split APK Split APK 是 Android 中一种应用程序安…

【测试运维】web自动化全知识点笔记第1篇:什么是Web自动化测试(已分享,附代码)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论Web自动化测试相关知识。了解什么是自动化&#xff0c;理解什么是自动化测试以及为什么要使用自动化测试。具体包含&#xff1a;WebDriver的基本操作&#xff0c;WebDriver的鼠标、键盘操作&#xff0c;下拉选择框、警告…