设计模式---桥接模式
问题场景:
现在的手机有很多不同的品牌,样式也各种各样,什么水滴屏,刘海屏,挖孔屏,什么华为,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
设计模式---桥接模式相关推荐
- Python设计模式-桥接模式
Python设计模式-桥接模式 基于Python3.5.2,代码如下 #coding:utf-8class Shape():name = ""param = "" ...
- 【学习笔记】ABAP OOD设计模式 - 桥接模式
ABAP OOD设计模式 - 桥接模式 整理转自-<SAP ABAP 面向对象程序设计(原则.模式及实践)> 桥接模式又称为桥梁模式,在程序开发中,采用不同的维度分解一系列对象,然后采用组 ...
- 跟着ZHONGHuan学习设计模式--桥接模式
转载请注明出处! ! !http://blog.csdn.net/zhonghuan1992 全部配套代码均在github上:https://github.com/ZHONGHuanGit/Desig ...
- 2.设计模式-桥接模式
文章目录 一.使用场景 二.实现方法 三.优势与劣势 四.经典案例 本文笔记来自于: 狂神的设计模式 桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化.它是一种对象结构模型,又称为柄体( ...
- 设计模式--桥接模式(Bridge)
设计模式–桥接模式(Bridge) 1.定义 桥接模式:将抽象部分与它的实现部分分离,使它们可以独立地变化. 2.实例 设想如果要绘制矩形.圆形.椭圆.正方形,我们至少需要4个形状类,但是如果绘制的图 ...
- linkin大话设计模式--桥接模式
linkin大话设计模式--桥接模式 桥接模式是一种结构化模式,他主要应对的是:由于实际的需要,某个类具有2个或者2个以上维度的变化,如果只是使用继承将无法实现功能,或者会使得设计变得相当的臃肿.我们 ...
- 23种设计模式——桥接模式
文章目录 23种设计模式--桥接模式 1.桥接模式概述 2.桥接模式结构 3.桥接模式的实现 4.桥接模式的注意事项和细节 23种设计模式--桥接模式 1.桥接模式概述 桥接模式介绍 桥接(Bridg ...
- 设计模式——桥接模式实验报告
目录 设计模式--桥接模式实验报告 一.实验题目 二.所用模式结构视图 三.本实例类图 四.实例实现代码 1.抽象消息类 2.普通消息类 3.加急消息类 4.特急消息类 5.实现发送消息的统一接口: ...
- Java设计模式-桥接模式 理论代码相结合
继Java设计模式-装饰器模式后的桥接模式出来了,感兴趣的话,就来看一看吧. 会了就当复习丫,不会来一起来看看吧. 很喜欢一句话:"八小时内谋生活,八小时外谋发展". 如果你也喜欢 ...
- 结合JDK源码看设计模式——桥接模式
前言: 在我们还没学习框架之前,肯定都学过JDBC.百度百科对JDBC是这样介绍的[JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Jav ...
最新文章
- Codeforces Round #256 (Div. 2) D Multiplication Table
- 第五章:管理数据库存储结构
- 降噪电路_拆解报告:Mobvoi出门问问 Ticpods ANC 真无线降噪耳机
- python路由编程_Python Django基础二之URL路由系统
- 密码学专题 密钥生成|分组加密的模式 ECB|CBC|CFB|OFB
- linux 树状结构图,linux下tree指令的用法, 树状图列出目录, 树状图逐级列出目录...
- Linux系统安装及配置——Centos-7-X86_64-DVD-2009
- jupyter一直*_不用下载安装,你的机器人可以直接在浏览器里跳舞丨Jupyter-ROS
- yii2 跨域请求配置_如何在SpringBoot应用中实现跨域访问资源和消息通信?
- C#结构体中的只写属性
- Web开发者必备的十大网站资源(转贴)
- SharePoint 2013 创建web应用程序报错This page can’t be displayed
- 【现代版】为人处世三十六计详解,真的很受益!
- 伟库网与英特尔联手打造“用友伟库云”
- 利用pytesseract进行图片文字识别
- 一文快速告诉你软件测试和软件调试有什么区别?
- 2023AE软件、Adobe After Effects下载、安装教程
- apache2.2配置https协议(key文件、crt文件、csr文件生成方法)
- PYTHON爬虫书籍
- 正则表达式验证手机号码是否正确
热门文章
- mysql8.0.19初始密码输入错误_MySQL 8.0.19支持输入3次错误密码锁定账户功能(例子)...
- php怎么调用dll例子,php调用dll的实例操作动画与代码分享_PHP教程
- python a除以b_A除以B (Python)
- java stream 使用局部变量
- javascript window Timing
- C语言 Win静态库
- Pandas 文本数据方法 split()rsplit()
- landset8各波段_landsat8波段
- 数据传输服务 DTS > 产品简介 > 功能特性 > 数据订阅(新版)
- Java设计模式学习总结(2)——创建型模式之工厂模式