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

相关推荐

  1. 设计模式

    2024-02-05 04:32:01       42 阅读
  2. [go] 模式

    2024-02-05 04:32:01       65 阅读
  3. 模式简介

    2024-02-05 04:32:01       43 阅读
  4. 模式

    2024-02-05 04:32:01       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-05 04:32:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-05 04:32:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-02-05 04:32:01       82 阅读
  4. Python语言-面向对象

    2024-02-05 04:32:01       91 阅读

热门阅读

  1. js custom-decorator 自定义装饰器,快速创建装饰器

    2024-02-05 04:32:01       54 阅读
  2. 【LeetCode-56】合并区间(贪心)

    2024-02-05 04:32:01       51 阅读
  3. 设计模式——七大原则

    2024-02-05 04:32:01       43 阅读