秦怀杂货店

General Store

  • 首页
  • 文章归档
  • 标签
  • 分类
  • 关于页面

  • 搜索
随便聊聊 数据结构 小游戏 数据库 Docker Springboot 系统设计 雪花算法 分布式 海量ip 最长回文子串 算法 面试题 线程池 多线程 线程 java学习 布隆过滤器 github 架构设计 docsify Git JVM LeetCode 杂货思考 设计模式 Lambda native isAssignableFrom 反射 剑指Offer mybatis SPI JDBC 编程工具 Java基础 集合

设计模式【7】-- 探索一下桥接模式

发表于 2022-01-05 | 分类于 设计模式 | 2 | 阅读次数 470

设计模式,写代码必备神器...

设计模式

桥接模式是什么?

桥接模式是把抽象化和实现化解耦,让两者可以独立,该设计模式属于结构性设计模式。何为将抽象化和实现化解耦,可以理解为将功能点抽象出来,功能的实现如何取决于不同的需求,但是抽象的功能点(接口)已经被桥接到原本的类型上,只用关注与实现。原本的类型变化,和抽象的功能点可以自由变化,中间的桥梁已经搭建起来了。

桥接模式其实就是不单单使用类继承的方式,而是重点使用类聚合的方式,进行桥接,把抽象的功能点,聚合(注入)到基类里面。

桥接模式的好处

一般用于解决什么问题呢?

主要是功能点实现种类多,多个维度的功能点,独立变化,没有什么关联,可以按照维度来管理。比如有 2 个维度,每个维度有 3 种实现,但是不同的维度之间其实没有关联,如果按照维度之间两两关联来搞,单单是实现类的数量就已经2 * 3 = 6个类了,是在不太合适,还耦合在一块。

用电脑举个例子,既会分成不同的品牌,比如戴尔,联想,又会分为台式机,笔记本,那么不同的类就会很多,功能可能比较重复。正是鉴于这一点,我们得剥离重复的功能,用桥接的方式,来维护抽象出来的共同功能点。

image-20211204132503297

如果再新增一个品牌,比如,华硕,那么又得增加两个类,这明显不太合适,不同的类很多功能可能会重复。

image-20211204131258227

那么桥接模式怎么处理呢?桥接模式把两个不同的维度 台式机 和 笔记本抽取出来,相当于作为一个通用的属性来维护。

image-20211205224859234

代码Demo演示

首先,定义一个抽象的电脑类AbstractComputer,在其中有一个属性是ComputerType,表示电脑的类型:

public abstract class AbstractComputer {

    protected ComputerType type;

    public void setType(ComputerType type) {
        this.type = type;
    }

    public abstract void work();
}

再定义三种类型的电脑:LenovoComputer,AsusComputer,DellComputer:

public class LenovoComputer extends AbstractComputer{

    @Override
    public void work() {
        System.out.print("联想");
        type.feature();
    }
}
public class AsusComputer extends AbstractComputer{
    @Override
    public void work() {
        System.out.print("华硕");
        type.feature();
    }
}
public class DellComputer extends AbstractComputer{
    @Override
    public void work() {
        System.out.print("戴尔");
        type.feature();
    }
}

电脑类型这个维度同样需要一个抽象类ComputerType,里面有一个说明功能的方法feature():

public abstract class ComputerType {
    // 功能特性
    public abstract void feature();
}

电脑类型这个维度,我们定义台式机和笔记本电脑两种:

public class DesktopComputerType extends ComputerType{
    @Override
    public void feature() {
        System.out.println(" 台式机:性能强大,拓展性强");
    }
}
public class LaptopComputerType extends ComputerType{
    @Override
    public void feature() {
        System.out.println(" 笔记本电脑:小巧便携,办公不在话下");
    }
}

测试一下,我们需要不同的搭配的时候,只需要将一个维度set到对象中去即可,就可以聚合出不同品牌不同类型的电脑:

public class BridgeTest {
    public static void main(String[] args) {
        ComputerType desktop = new DesktopComputerType();
        LenovoComputer lenovoComputer = new LenovoComputer();
        lenovoComputer.setType(desktop);
        lenovoComputer.work();

        ComputerType laptop = new LaptopComputerType();
        DellComputer dellComputer = new DellComputer();
        dellComputer.setType(laptop);
        dellComputer.work();
    }
}

测试结果:

联想 台式机:性能强大,拓展性强
戴尔 笔记本电脑:小巧便携,办公不在话下

总结一下

桥接模式,本质上就是将不同维度或者说功能,抽象出来,作为属性,聚合到对象里面,而不是通过继承。这样一定程度上减少了类的数量,但是如果不同的维度之间,变化是相关联的,这样使用起来还需要再做各种特殊判断,使用起来容易造成混乱,不宜使用。(重点:用组合/聚合关系代替继承关系来实现)

JDBC,搞过Java的同学应该都知道,这是一种Java统一访问数据库的API,可以操作Mysql,Oracle等,主要用到的设计模式也是桥接模式,有兴趣可以了解一下Driver驱动类管理的源码。

【作者简介】:
秦怀,公众号【秦怀杂货店】作者,技术之路不在一时,山高水长,纵使缓慢,驰而不息。个人写作方向:Java源码解析,JDBC,Mybatis,Spring,redis,分布式,剑指Offer,LeetCode等,认真写好每一篇文章,不喜欢标题党,不喜欢花里胡哨,大多写系列文章,不能保证我写的都完全正确,但是我保证所写的均经过实践或者查找资料。遗漏或者错误之处,还望指正。

剑指Offer全部题解PDF

开源编程笔记

  • 本文作者: 秦怀杂货店
  • 本文链接: http://aphysia.cn/archives/she-ji-mo-shi-7--tan-suo-yi-xia-qiao-jie-mo-shi-
  • 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!
# 随便聊聊 # 数据结构 # 小游戏 # 数据库 # Docker # Springboot # 系统设计 # 雪花算法 # 分布式 # 海量ip # 最长回文子串 # 算法 # 面试题 # 线程池 # 多线程 # 线程 # java学习 # 布隆过滤器 # github # 架构设计 # docsify # Git # JVM # LeetCode # 杂货思考 # 设计模式 # Lambda # native # isAssignableFrom # 反射 # 剑指Offer # mybatis # SPI # JDBC # 编程工具 # Java基础 # 集合
数据库批量插入这么讲究的么?
设计模式【8】-- 手工耿教我写装饰器模式
  • 文章目录
  • 站点概览
秦怀杂货店

秦怀杂货店

纵然缓慢,驰而不息。

145 日志
19 分类
37 标签
Github E-mail
Creative Commons
0%
© 2022 秦怀杂货店
由 Halo 强力驱动
|
主题 - NexT.Pisces v5.1.4