问题场景:

现在的手机有很多不同的品牌,样式也各种各样,什么水滴屏,刘海屏,挖孔屏,什么华为,vivo,小米等等。如果我们基于继承关系来设计的话,你就会发现这个时候有点无从下手了。

当然这个图的设计是不合理的,你也可以试着将不同的屏再抽象下,但是发现还是不是很合理,而且即使实现了要扩展的话很是麻烦。这个时候我们就可以引入桥接模式。

桥接模式的主要特点就是把抽象化与行为实现解耦,使得二者可以独立变化。

在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活,就像上述场景,手机厂家有多个,手机屏幕也是多元化的。

比如上诉问题,我们这样来设计

打电话的行为提取一个接口出来,手机提取一个抽象出来,在抽象(Phone)里面去聚合行为(Brand),这个过程就像搭了个桥把抽象与行为连接起来。当然这样也把抽象和行为分离开来了,可以独立扩展,如果我要新增一个折叠屏的,只需要在抽象这边加一个类就OK,如果需要扩展手机品牌,只需要在接口实现那边加个小米就可以了,二者可以独立变化,提高系统的灵活性。

行为侧:

接口:

package com.nijunyang.designpatterns.bridge.api;/*** @author: create by nijunyang* @date:2019/9/22*/
public interface Brand {void call();void close();
}

接口实现:

package com.nijunyang.designpatterns.bridge.impl;import com.nijunyang.designpatterns.bridge.api.Brand;/*** @author: create by nijunyang* @date:2019/9/22*/
public class HuaWei implements Brand {@Overridepublic void call() {System.out.println("华为手机打电话");}@Overridepublic void close() {System.out.println("华为手机关机");}
}

抽象:

抽象类:

package com.nijunyang.designpatterns.bridge.phone;import com.nijunyang.designpatterns.bridge.api.Brand;/*** @author: create by nijunyang* @date:2019/9/22*/
public abstract class Phone {private Brand brand;public Phone(Brand brand) {this.brand = brand;}public void call() {brand.call();}public void close() {brand.close();}
}

子类:

package com.nijunyang.designpatterns.bridge.phone;import com.nijunyang.designpatterns.bridge.api.Brand;/*** @author: create by nijunyang* @date:2019/9/22*/
public class WaterDropScreePhone extends Phone {public WaterDropScreePhone(Brand brand) {super(brand);}@Overridepublic void call() {System.out.print("这是水滴屏");super.call();}@Overridepublic void close() {System.out.print("这是水滴屏");super.close();}
}

测试:

package com.nijunyang.designpatterns.bridge;import com.nijunyang.designpatterns.bridge.impl.HuaWei;
import com.nijunyang.designpatterns.bridge.phone.Phone;
import com.nijunyang.designpatterns.bridge.phone.WaterDropScreePhone;/*** @author: create by nijunyang* @date:2019/9/22*/
public class Test {public static void main(String[] args){Phone phone = new WaterDropScreePhone(new HuaWei());phone.call();}
}

使用桥接模式需要找到合适的抽象与行为进行分离,它可以替代使用继承出现的多层继承或者接口的多实现情况,降低系统的管理和维护成本。但是会增加系统的理解和设计难度。

JDBC驱动就是一个桥接模式的应用,通过DriverManager去聚合Connection实现搭桥,DriverManager通过配置去看是mysql或者是oracle等。各种武功变化万千,为武功心法不变,桥接模式中,抽象不一定非得是抽象类,行为也不一定非要抽取一个接口出来,就像JDBC这个,心法是一样,打出来的招式却有些变化。还有银行转账也是一个场景,不同用户可以通过不同方式转账。用户:普通用户,黄金用户,白金用户...,转账方式:网银转账 ,柜台转账,ATM转账,第三方支付转账...

转载于:https://www.cnblogs.com/nijunyang/p/11565760.html

设计模式---桥接模式相关推荐

  1. Python设计模式-桥接模式

    Python设计模式-桥接模式 基于Python3.5.2,代码如下 #coding:utf-8class Shape():name = ""param = "" ...

  2. 【学习笔记】ABAP OOD设计模式 - 桥接模式

    ABAP OOD设计模式 - 桥接模式 整理转自-<SAP ABAP 面向对象程序设计(原则.模式及实践)> 桥接模式又称为桥梁模式,在程序开发中,采用不同的维度分解一系列对象,然后采用组 ...

  3. 跟着ZHONGHuan学习设计模式--桥接模式

    转载请注明出处! ! !http://blog.csdn.net/zhonghuan1992 全部配套代码均在github上:https://github.com/ZHONGHuanGit/Desig ...

  4. 2.设计模式-桥接模式

    文章目录 一.使用场景 二.实现方法 三.优势与劣势 四.经典案例 本文笔记来自于: 狂神的设计模式 桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化.它是一种对象结构模型,又称为柄体( ...

  5. 设计模式--桥接模式(Bridge)

    设计模式–桥接模式(Bridge) 1.定义 桥接模式:将抽象部分与它的实现部分分离,使它们可以独立地变化. 2.实例 设想如果要绘制矩形.圆形.椭圆.正方形,我们至少需要4个形状类,但是如果绘制的图 ...

  6. linkin大话设计模式--桥接模式

    linkin大话设计模式--桥接模式 桥接模式是一种结构化模式,他主要应对的是:由于实际的需要,某个类具有2个或者2个以上维度的变化,如果只是使用继承将无法实现功能,或者会使得设计变得相当的臃肿.我们 ...

  7. 23种设计模式——桥接模式

    文章目录 23种设计模式--桥接模式 1.桥接模式概述 2.桥接模式结构 3.桥接模式的实现 4.桥接模式的注意事项和细节 23种设计模式--桥接模式 1.桥接模式概述 桥接模式介绍 桥接(Bridg ...

  8. 设计模式——桥接模式实验报告

    目录 设计模式--桥接模式实验报告 一.实验题目 二.所用模式结构视图 三.本实例类图 四.实例实现代码 1.抽象消息类 2.普通消息类 3.加急消息类 4.特急消息类 5.实现发送消息的统一接口: ...

  9. Java设计模式-桥接模式 理论代码相结合

    继Java设计模式-装饰器模式后的桥接模式出来了,感兴趣的话,就来看一看吧. 会了就当复习丫,不会来一起来看看吧. 很喜欢一句话:"八小时内谋生活,八小时外谋发展". 如果你也喜欢 ...

  10. 结合JDK源码看设计模式——桥接模式

    前言: 在我们还没学习框架之前,肯定都学过JDBC.百度百科对JDBC是这样介绍的[JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Jav ...

最新文章

  1. Codeforces Round #256 (Div. 2) D Multiplication Table
  2. 第五章:管理数据库存储结构
  3. 降噪电路_拆解报告:Mobvoi出门问问 Ticpods ANC 真无线降噪耳机
  4. python路由编程_Python Django基础二之URL路由系统
  5. 密码学专题 密钥生成|分组加密的模式 ECB|CBC|CFB|OFB
  6. linux 树状结构图,linux下tree指令的用法, 树状图列出目录, 树状图逐级列出目录...
  7. Linux系统安装及配置——Centos-7-X86_64-DVD-2009
  8. jupyter一直*_不用下载安装,你的机器人可以直接在浏览器里跳舞丨Jupyter-ROS
  9. yii2 跨域请求配置_如何在SpringBoot应用中实现跨域访问资源和消息通信?
  10. C#结构体中的只写属性
  11. Web开发者必备的十大网站资源(转贴)
  12. SharePoint 2013 创建web应用程序报错This page can’t be displayed
  13. 【现代版】为人处世三十六计详解,真的很受益!
  14. 伟库网与英特尔联手打造“用友伟库云”
  15. 利用pytesseract进行图片文字识别
  16. 一文快速告诉你软件测试和软件调试有什么区别?
  17. 2023AE软件、Adobe After Effects下载、安装教程
  18. apache2.2配置https协议(key文件、crt文件、csr文件生成方法)
  19. PYTHON爬虫书籍
  20. 正则表达式验证手机号码是否正确

热门文章

  1. mysql8.0.19初始密码输入错误_MySQL 8.0.19支持输入3次错误密码锁定账户功能(例子)...
  2. php怎么调用dll例子,php调用dll的实例操作动画与代码分享_PHP教程
  3. python a除以b_A除以B (Python)
  4. java stream 使用局部变量
  5. javascript window Timing
  6. C语言 Win静态库
  7. Pandas 文本数据方法 split()rsplit()
  8. landset8各波段_landsat8波段
  9. 数据传输服务 DTS > 产品简介 > 功能特性 > 数据订阅(新版)
  10. Java设计模式学习总结(2)——创建型模式之工厂模式