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

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

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


一言

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


设计实验室

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

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


反骨乍现

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

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

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

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


桥接模式力挽狂澜

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


代码实现

品牌接口

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

品牌实现

class Vivo implements Brand{@Overridepublic void open() {System.out.println("Vivo手机开机");}@Overridepublic void close() {System.out.println("Vivo手机关机");}@Overridepublic void call() {System.out.println("Vivo手机打电话");}
}
class Mi implements Brand{@Overridepublic void open() {System.out.println("小米手机开机");}@Overridepublic void close() {System.out.println("小米手机关机");}@Overridepublic 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.hqwc.cn/news/451972.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux进程信号处理:深入理解与应用(2​​)

🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:its 6pm but I miss u already.—bbbluelee 0:01━━━━━━️💟──────── 3:18 🔄 ◀️…

MySQL数据库①_MySQL入门(概念+使用)

目录 1. 数据库的概念 1.1 数据库的存储介质 1.2 主流数据库 2. MySQL的基本使用 2.1 链接数据库 2.2 服务器管理 2.3 数据库,服务器和表关系 2.4 简单MySQL语句 3. MySQL架构 4. SQL分类 5. 存储引擎 本篇完。 1. 数据库的概念 数据库是按照数据结构来…

华为nova12系列:图片HDR显示,让你的照片全面升级!

你是不是也想给自己的照片加点料,让它们看起来更真实、捕捉到更多的细节和光影?不用愁,华为nova12系列就为你量身打造了图片HDR显示技术,让你的照片从此焕发绚丽光芒! 回忆一下,在节日的夜晚想拍下绚丽的灯…

【Java】Redis入门

1. Redis入门 1.1 Redis简介 Redis是一个基于内存的key-value结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件。 **官网:**https://redis.io **中文网:**https://www.redis.net.cn/ key-value结构存储: 主要特点&#xff1a…

数据结构(C语言)代码实现(六)——单链表的实现

目录 参考、格式 头文件LinkList.h 一、将函数的小括号写成中括号 二、读取权限冲突 三、L->Last指针没有移动 四、函数指针的使用 头文件完整代码 测试函数(主函数)test.cpp 测试结果 参考、格式 数据结构课本2.3节(严蔚敏版&a…

开发知识点-swoole高性能Php异步编程框架

swoole高性能Php异步编程框架 介绍主要特性应用场景使用Swoole的优势 介绍 Swoole 是一个高性能的 PHP 异步编程框架, 它允许PHP开发者编写高并发、实时、异步的网络服务器和应用。 Swoole 通过提供了一套在PHP中使用异步I/O、协程(Coroutine&#xff…

「递归算法」:验证二叉搜索树

一、题目 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 示例 1&#xff…

三层交换组网实验(思科)

一,技术简介 三层交换技术的出现,解决子网必须依赖路由器进行管理的问题,解决传统路由器低速、复杂所造成的网络瓶颈问题。一个具有三层交换功能的设备可简单理解为:一个带有第三层路由功能的第二层交换机。 二,实验目…

特种作业题不会怎么搜答案?推荐你使用这六个公众号和工具 #其他#学习方法特种作业题不会怎么搜答案?推荐你使用这六个公众号和工具 #其他#学习方法

作为当代大学生,我们常常面临着繁重的学业压力和众多的学习任务。在这个信息爆炸的时代,如何高效地进行搜题和学习成了我们迫切需要解决的问题。幸运的是,随着科技的不断进步,我们拥有了许多方便、实用的日常搜题和学习软件。 1.…

【漏洞库】O2OA系统

O2OA invoke 后台远程命令执行漏洞 CNVD-2020-18740 漏洞描述 O2OA是一款开源免费的企业及团队办公平台,提供门户管理、流程管理、信息管理、数据管理四大平台,集工作汇报、项目协作、移动OA、文档分享、流程审批、数据协作等众多功能,满足企业各类管理…

路由引入路由过滤

目录 路由引入 什么是路由引入? 为什么需要路由引入? 路由引入的规划分为两种 路由过滤 路由过滤的工具 前缀列表格式 filter-policy router-policy 路由引入 什么是路由引入? 将一种协议导入到另一种协议或在同种协议的不同进程…

Methyltetrazine-PEG4-azide,甲基四嗪PEG4叠氮,具有高反应活性

您好,欢迎来到新研之家 文章关键词:Methyltetrazine-PEG4-azide,Methyltetrazine-PEG4-N3,N3-PEG4-Methyltetrazine,甲基四嗪-四聚乙二醇-叠氮,甲基四嗪PEG4叠氮,叠氮PEG4甲基四嗪 一、基本信…