ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-01-05 08:31:07  阅读:117  来源: 互联网

标签:桥接 void class -- 维度 设计模式 public ComputerType


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

设计模式

桥接模式是什么?

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

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

桥接模式的好处

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

主要是功能点实现种类多,多个维度的功能点,独立变化,没有什么关联,可以按照维度来管理。比如有 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源码解析JDBCMybatisSpringredis分布式剑指OfferLeetCode等,认真写好每一篇文章,不喜欢标题党,不喜欢花里胡哨,大多写系列文章,不能保证我写的都完全正确,但是我保证所写的均经过实践或者查找资料。遗漏或者错误之处,还望指正。

剑指Offer全部题解PDF

开源编程笔记

标签:桥接,void,class,--,维度,设计模式,public,ComputerType
来源: https://www.cnblogs.com/Damaer/p/15765305.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有