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

2024-02-05 23:44

本文主要是介绍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

这篇关于13.从桥接模式细品人生的几座桥的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/682526

相关文章

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

大数据spark3.5安装部署之local模式详解

《大数据spark3.5安装部署之local模式详解》本文介绍了如何在本地模式下安装和配置Spark,并展示了如何使用SparkShell进行基本的数据处理操作,同时,还介绍了如何通过Spark-su... 目录下载上传解压配置jdk解压配置环境变量启动查看交互操作命令行提交应用spark,一个数据处理框架

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

模版方法模式template method

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/template-method 超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 上层接口有默认实现的方法和子类需要自己实现的方法

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

迭代器模式iterator

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/iterator 不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素