【设计模式】八、桥接模式

文章目录

  • 举例
  • 问题分析
  • 基本介绍
  • 桥接模式在 JDBC 的源码剖析
  • 桥接模式的注意事项和细节
  • JDBC

举例

现在对不同手机类型的不同品牌实现操作编程(比如:开机、关机、上网,打电话等),
传统方法对应的类图:
在这里插入图片描述

问题分析

  1. 扩展性问题(类爆炸),如果我们再增加手机的样式(旋转式),就需要增加各个品牌手机的类,同样如果我们增加一个手机品牌,也要在各个手机样式类下增加。
  2. 违反了单一职责原则,当我们增加手机样式时,要同时增加所有品牌的手机,这样增加了代码维护成本.
  3. 解决方案-使用桥接模式

基本介绍

  1. 桥接模式(Bridge 模式)是指:将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变。
  2. 是一种结构型设计模式
  3. Bridge 模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。它的主要特点是把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展

原理类图:
在这里插入图片描述

  1. Client 类:桥接模式的调用者
  2. 抽象类(Abstraction) :维护了 Implementor / 即它的实现类 ConcreteImplementorA…, 二者是聚合关系, Abstraction充当桥接类
  3. RefinedAbstraction : 是 Abstraction 抽象类的子类
  4. Implementor : 行为实现类的接口
  5. ConcreteImplementorA/B :行为的具体实现类
  6. 从 UML 图:这里的抽象类和接口是聚合的关系,其实调用和被调用关系
    在这里插入图片描述
//接口
public interface Brand {void open();void close();void call();
}
public class Vivo implements Brand {@Overridepublic void open() {// TODO Auto-generated method stubSystem.out.println(" Vivo手机开机 ");}@Overridepublic void close() {// TODO Auto-generated method stubSystem.out.println(" Vivo手机关机 ");}@Overridepublic void call() {// TODO Auto-generated method stubSystem.out.println(" Vivo手机打电话 ");}}
public class XiaoMi implements Brand {@Overridepublic void open() {// TODO Auto-generated method stubSystem.out.println(" 小米手机开机 ");}@Overridepublic void close() {// TODO Auto-generated method stubSystem.out.println(" 小米手机关机 ");}@Overridepublic void call() {// TODO Auto-generated method stubSystem.out.println(" 小米手机打电话 ");}}
public abstract class Phone {//组合品牌private Brand brand;//构造器public Phone(Brand brand) {super();this.brand = brand;}protected void open() {this.brand.open();}protected void close() {brand.close();}protected void call() {brand.call();}}
//折叠式手机类,继承 抽象类 Phone
public 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(" 折叠样式手机 ");}
}
public 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(" 直立样式手机 ");}
}
public class Client {public static void main(String[] args) {//获取折叠式手机 (样式 + 品牌 )Phone phone1 = new FoldedPhone(new XiaoMi());phone1.open();phone1.call();phone1.close();System.out.println("=======================");Phone phone2 = new FoldedPhone(new Vivo());phone2.open();phone2.call();phone2.close();System.out.println("==============");UpRightPhone phone3 = new UpRightPhone(new XiaoMi());phone3.open();phone3.call();phone3.close();System.out.println("==============");UpRightPhone phone4 = new UpRightPhone(new Vivo());phone4.open();phone4.call();phone4.close();}}

桥接模式在 JDBC 的源码剖析

在这里插入图片描述
在这里插入图片描述

桥接模式的注意事项和细节

  1. 实现了抽象和实现部分的分离,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来,这有助于系统进行分层设计,从而产生更好的结构化系统。
  2. 对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了,其它的部分由具体业务来完成。
  3. 桥接模式替代多层继承方案,可以减少子类的个数,降低系统的管理和维护成本。桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程
  4. 桥接模式要求正确识别出系统中两个独立变化的维度(抽象、和实现),因此其使用范围有一定的局限性,即需要有这样的应用场景。
    桥接模式其它应用场景
    对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用.

JDBC

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/102299.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TCP/IP(五)TCP的连接管理(二)三次握手细节

一 ISN序列号探究 本文主要探究三次握手建立TCP连接的细节备注: 某些问题探究的比较深入,当前用不到,暂时通过链接引入进来吃水不忘挖井人: 小林 coding ① 初始序列号 ISN 是如何随机产生的 ISN: 初始化序列号 Initial Sequence Number 接收方和…

scsi READ CAPACITY (10)命令总结

READ CAPACITY (10)概述: READ CAPACITY(10)命令(参见表119)请求设备服务器将描述直接访问块设备的容量和介质格式的8字节参数数据传输到数据缓存中。这个命令可以被处理,就好像它有一个HEAD OF QUEUE任务属性。 如果逻辑单元支持保护信息,应…

渗透测试KAILI系统的安装环境(第八课)

KAILI系统的安装环境(第八课) Kaili是一款基于PHP7的高性能微服务框架,其核心思想是面向服务的架构(SOA),支持http、websocket、tcp等多种通信协议,同时还提供了RPC、Service Mesh、OAuth2等功能。Kaili框架非常适合构…

gradle

Gradle Gradle 介绍 Gradle 官方文档是这样介绍的 Gradle 的: Gradle is an open-source build automationopen in new window tool flexible enough to build almost any type of software. Gradle makes few assumptions about what you’re trying to build or…

相机噪声评估

当拥有一个相机,并且写了一个降噪的算法,想要测试降噪的应用效果。 相机在光线不足的情况下产生噪点的原因主要与以下几个因素有关: 感光元件的工作原理:相机的图像传感器是由数百万甚至数千万的感光元件(如CMOS或CC…

怎么把heic改成jpg?方法大全在这里

怎么把heic改成jpg?HEIC是一种现代的图像文件格式。它是由ISO制定的标准,并得到了苹果公司的支持和推广。与JPG等传统图像格式相比,HEIC格式可以提供更好的图像质量,并且占用更少的存储空间。这使得它在手机、平板电脑和其他移动设…

CANoe-如何实现27服务解锁

27服务解锁的工作原理可以在文章《诊断27服务介绍》查看,这里简单介绍下流程: Tester向ECU发送27 01诊断请求请求种子seed,ECU收到该请求后随机生成一个seed,通过67 01诊断响应发送给Tester。Tester收到该诊断响应后取出seed值,传入和ECU相同的算法后生成一个密钥keyT。然…

《理解深度学习》2023最新版本+习题答案册pdf

刚入门深度学习或者觉得学起来很困难的同学看过来了,今天分享的这本深度学习教科书绝对适合你。 就是这本已在外网获13.1万次下载的宝藏教科书《理解深度学习》。本书由巴斯大学计算机科学教授Simon J.D. Prince撰写,全书共541页,目前共有21…

Vscode 插件-代码敲出不同的特效

为了让写代码的时候增加一点趣味性,vscode有个插件,可以增加烟花特效,还挺好玩的。 一.在应用商店下载这个插件 二. 在设置里 添加配置文件 settings.json //是否开启"powermode.enabled": true,//效果样式 “水花-particles”,…

PostMan环境变量、全局变量、动态参数使用

一、环境准备 postmanmoco [{"description": "登录认证","request": {"uri": "/login","method": "post","forms": {"user": "admin","password": "a123…

CentOS 7 基于C 连接ZooKeeper 客户端

前提条件:CentOS 7 编译ZooKeeper 客户端,请参考:CentOS 7 编译ZooKeeper 客户端 1、Docker 安装ZooKeeper # docker 获取zookeeper 最新版本 docker pull zookeeper# docker 容器包含镜像查看 docker iamges# 准备zookeeper 镜像文件挂载对…

【C#】什么是并发,C#常规解决高并发的基本方法

给自己一个目标,然后坚持一段时间,总会有收获和感悟! 在实际项目开发中,多少都会遇到高并发的情况,有可能是网络问题,连续点击鼠标无反应快速发起了N多次调用接口, 导致极短时间内重复调用了多次…

Tomcat 线程模型性能调优

Linux I/O模型详解 I/O要解决什么问题 I/O:在计算机内存与外部设备之间拷贝数据的过程。 程序通过CPU向外部设备发出读指令,数据从外部设备拷贝至内存需要一段时间,这段时间CPU就没事情做了,程序就会两种选择: 让出…

四款数字办公工具大比拼,在线办公无压力

在线办公软件使企业、员工实现办公场所、距离的自由,尤其是近几年,受“口罩”的影响,远程办公软件的使用者也越来越多,无论是财务、行政、还是设计师,都开始追求好用的在线办公软件,作为办公软件发烧友&…

C++11新特性(右值引用,万能转发)

这篇文章是C的重中之重,通过这篇文章你能体会到C/C大佬们对性能的极致追求,你能感受到独属C/C人的浪漫,对高消耗的零容忍,对高性能的不倦探索。右值引用是由Scott Meyers在他的著名书籍《Effective C》中提出的,因为其…

webservice接口自动化测试

1&#xff0c;用soupui进行测试 2&#xff0c;安装soupUI 3&#xff0c;测试的时候是给了一个wdsl 操作步诹&#xff1a;new &#xff08;name , 填写地址&#xff09;---导入wsdl文件---看到所有的接口 发送请求的格式<xml> canshu</xml> 应用场景&#xff0c…

hutool实现文件上传与下载

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency> 文件上传需要创建一个表 Autowiredprivate SysFileInfoMapper sysFileInfoMapper;Value("${ty.…

常用的语音芯片工作原理_分类为语音播报 语音识别 语音合成tts

1.0 语音芯片分类-语音播报-语音识别-语音合成 关于声音的需求&#xff0c;从始至终&#xff0c;都是很刚需的需求 。从语音芯片的演化就能看出很多的端倪&#xff0c;很多很多的产品他必须要有语音&#xff0c;才能实现更好的交互。而语音芯片的需求分类&#xff0c;其实也是很…

3D模型格式转换工具HOOPS Exchange:模型数据自由导入和导出

HOOPS Exchange是一套高性能软件库&#xff0c;可以为软件开发人员提供导入和导出3D文件格式的能力。HOOPS Exchange导入3D数据后&#xff0c;会将3D数据转换为PRC格式存放到内存中&#xff0c;最后导出成为其他3D格式。&#xff08;点击申请HOOPS Exchange免费试用&#xff09…

人大金仓数据库V8 windows下安装

此文为人大金仓数据库安装程序&#xff08;windows下kingbase开发及测试用&#xff09;。 1 人大金仓-成为世界卓越的数据库产品与服务提供商 官方下载安装包&#xff0c;同时需要下载授权文件&#xff0c;补丁文件可以不下。 2 点击安装 3 选择授权文件 4 默认安装即可&…