桥接模式学习

目录

  • 背景
  • 过程
  • 总结

背景

现在要解决源码阶段的继承关系,无法在运行时改变从父类继承的实现。这里用的是手机品牌还有手机中的app,这种问题如何进行解决呢。这就要引入一个模式:桥接模式

过程

1、原则:合成/复用原则 :尽量使用合成/聚合原则,不要使用类继承。
2、定义:将抽象部分和它的实现分离,使他们都可以独立变化。(不是说抽象类和实现类分离,实现指的是抽象类和它的派生类用来实现自己的对象。)

3、例子:

如手机品牌和手机app的关系,他们可以是继承关系,也可以是关联关系。

如果是继承关系的话,是对象的继承关系在编译的时候定义好了,无法在运行时改变从父类继承的实现。子类的视线和它的父类有很紧密的依赖关系,父类实现中的任何变化必然会导致子类发生变化。于是出现了这种聚合关系。

在这里插入图片描述

  1. Abstraction抽象类
public abstract class Abstraction {private Implementor imp;//约束子类必须实现该构造函数public Abstraction(Implementor imp) {this.imp = imp;}public Implementor getImp() {return imp;}//自身的行为和属性public void request() {this.imp.doSomething();}}
  1. Implementor抽象类
public abstract class Implementor {public abstract void doSomething();public abstract void doAnything();}
  1. ConcreteImplementor
public class ConcreteImplementorA extends Implementor {public void doSomething() {System.out.println("具体实现A的doSomething执行");}public void doAnything() {System.out.println("具体实现A的doAnything执行");}
}
  1. RefinedAbstraction
public class RefinedAbstraction extends Abstraction {//覆写构造函数public RefinedAbstraction(Implementor imp) {super(imp);}//修正父类行为public void request() {super.request();super.getImp().doAnything();}}
  1. Client客户端
public class Client {public static void main(String[] args) {Implementor imp = new ConcreteImplementorA();Abstraction abs = new RefinedAbstraction(imp);abs.request();}}

二、桥接模式的应用
1. 何时使用

系统可能有多个角度分类,每一种角度都可能变化时

2. 方法

把这种角度分类分离出来,让它们单独变化,减少它们之间的耦合(合成/聚合复用原则)

3. 优点

抽象和实现分离。桥梁模式完全是为了解决继承的缺点而提出的设计模式
优秀的扩展能力
实现细节对客户透明。客户不用关心细节的实现,它已经由抽象层通过聚合关系完成了封装

4. 缺点

会增加系统的理解与设计难度。由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程

5. 使用场景

不希望或不适用使用继承的场景
接口或抽象类不稳定的场景
重用性要求较高的场景

6. 应用实例

开关。我们可以看到的开关是抽象的,不用管里面具体怎么实现
手机品牌与手机软件。两者间有一条聚合线,一个手机品牌可以有多个手机软件

7. 注意事项

不要一涉及继承就考虑该模式,尽可能把变化的因素封装到最细、最小的逻辑单元中,避免风险扩散
当发现类的继承有n层时,可以考虑使用该模式.

三、桥接模式的实现
下面我们举一个例子,就拿上面说的手机品牌与手机软件为例,我们可以让手机既可以按照手机品牌来分类,也可以按手机软件来分类。由于实现的方式有多种,桥接模式的核心意图就是把这些实现独立出来,让它们各自地变化,这就使得没中实现的变化不会影响其他实现,从而达到应对变化的目的。
在这里插入图片描述

  1. 手机品牌抽象类
public abstract class HandsetBrand {protected HandsetSoft soft;//设置手机软件public void setHandsetSoft(HandsetSoft soft) {this.soft = soft;}//运行public abstract void run();}
  1. 手机软件抽象类
public abstract class HandsetSoft {public abstract void run();}
  1. 各类手机品牌
public class HandsetBrandA extends HandsetBrand {public void run() {soft.run();}}
  1. 各类手机软件
public class HandsetGame extends HandsetSoft {public void run() {System.out.println("运行手机游戏");}}
5. Client客户端
public class Client {public static void main(String[] args) {HandsetBrand ab;//使用A品牌手机ab = new HandsetBrandA();System.out.println("A品牌手机:");ab.setHandsetSoft(new HandsetGame());ab.run();ab.setHandsetSoft(new HandsetAddressList());ab.run();//分隔符System.out.println("---------------");//使用B品牌手机ab = new HandsetBrandB();System.out.println("B品牌手机:");ab.setHandsetSoft(new HandsetGame());ab.run();ab.setHandsetSoft(new HandsetAddressList());ab.run();}}

总结

这个桥接模式最深刻的一个点是:将源码定义好的关系修改为运行时在客户端中指定关系。解开源码定义好的类之间的耦合,变成运行的时候才让类之间耦合起来。

这样我现在如果想要增加一个功能,比如音乐播放器,那么只有增加这个类就可以了,不会影响到其他任何类,类的个数增加也只是一个;如果是要增加S品牌,只需要增加一个品牌的子类就可以了,个数也是一个,不会影响到其他类。这显然符合开放-封闭原则。
而这里用到的合成/聚合复用原则是一个很有用处的原则,即优先使用对象的合成或聚合,而不是继承。究其原因是因为继承是一种强耦合的结构,父类变,子类就必须变。

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

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

相关文章

PPT幻灯片里的图片,批量提取

之前分享过如何将PPT文件导出成图片,今天继续分享PPT技巧,如何提取出PPT文件里面的图片。 首先,我们将PPT文件的后缀名,修改为rar,将文件改为压缩包文件 然后我们将压缩包文件进行解压 最好是以文件夹的形式解压出来…

java学习part06数组工具类

1比较内容 2输出信息 3值填充 4快速排序 5二分查找 负数没找到,其他表示下标

Linux本地WBO创作白板部署与远程访问

文章目录 前言1. 部署WBO白板2. 本地访问WBO白板3. Linux 安装cpolar4. 配置WBO公网访问地址5. 公网远程访问WBO白板6. 固定WBO白板公网地址 前言 WBO在线协作白板是一个自由和开源的在线协作白板,允许多个用户同时在一个虚拟的大型白板上画图。该白板对所有线上用…

Kafka 集群实现数据同步

Kafka 介绍 Kafka 是一个高吞吐的分布式消息系统,不但像传统消息队列(RaabitMQ、RocketMQ等)那样能够【异步处理、流量消峰、服务解耦】 还能够把消息持久化到磁盘上,用于批量消费。除此之外由于 Kafka 被设计成分布式系统&…

airlearning-ue4安装的踩坑记录

最近要安装airlearning-ue4,用于实现无人机仿真环境,该项目地址为:GitHub - harvard-edge/airlearning-ue4: Environment Generator for Air Learning Project. This version is build on top of UE4 game engine 由于这个项目已经完成好几年…

buildadmin+tp8表格操作(5)自定义组装搜索的查询

有时候我们会自定义组装一些数据,发送给后端,让后端来进行筛选,这里有一个示例 const onComSearchIdEq () > {// 展开公共搜索baTable.table.showComSearch true/*** 公共搜索表单赋值* 范围搜索有两个输入框,输入框绑定变量…

表内容的操作(增删查改)【MySQL】

文章目录 表的 CRUDCreate(增加)插入记录插入冲突则更新记录替换记录 Retrieve(查找)查找记录指定表达式的别名为结果去重WHERE 子句运算符条件查询区间查询模糊查询空值查询 对结果排序筛选分页结果 Update(修改&…

集合框架面试题

一、集合容器的概述 1. 什么是集合 集合框架:用于存储数据的容器。 集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。 任何集合框架都包含三大块内容: 对外的接口、接口的实现和对集合运算的算 法。 接口:表示集合的抽象数据…

机器人制作开源方案 | 钻孔植树一体化沙漠车

作者:徐邦国、张博宇、刘露、李晶晶、吕洁秀单位:天津职业技术师范大学 机械工程学院指导老师:何永利 摘要:本项目旨在设计一种专用于沙漠植树的植树车,以沙漠自动化植树为研究对象,提出一种创新式钻…

milvus采坑一:启动服务就会挂掉

原因一 硬盘满了,Eric数据文件存储在硬盘上,当硬盘不足,它就会启动后就挂掉。 此时pymilvus连接一直是timeout。 解决方法:更换存储路径。

外观模式 rust和java的实现

外观模式 外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。它向现有的系统添加一个接口,来隐藏系统的复杂性。 举个例子 :就像电脑的usb接口,自己内部实现了复杂…

python note

Python 基本操作 (赋值、分支及循环语句、使用 import 导入库); Python 的 With 语句 ; NumPy ,Python 下常用的科学计算库。TensorFlow 与之结合紧密; 向量 和 矩阵 运算(矩阵的加减法、矩阵…

智慧化工园区信息化整体解决方案:PPT全53页,附下载

关键词:智慧化工园区建设方案,智慧化工园区建设规范,智慧化工园区建设指南 一、售智慧化工园区建设背景 随着工业化、信息化和数字化进程的加速,化工园区面临着越来越多的挑战,如安全生产、环境保护、能源消耗等问题…

2023.11.17使用flask将多个图片文件上传至服务器

2023.11.17使用flask将多个图片文件上传至服务器 实现功能: 1、同时上传多个图片文件 2、验证文件扩展名 3、显示上传文件的文件名 4、显示文件上传结果 程序结构 main.py from flask import Flask, request, jsonify, render_template import osapp Flask(__n…

GaussDB SQL基础语法示例-GOTO语句

目录 一、前言 二、在GaussDB数据库中的概念及语法 1、基本概念 2、语法 三、在GaussDB数据库中的基础示例和限制场景说明 1、基础示例 2、限制场景说明 四、小结 一、前言 SQL是用于访问和处理数据库的标准计算机语言。GaussDB支持SQL标准(默认支持SQL2、…

Arcgis 日常天坑问题2——三维场景不能不能加载kml图层,着手解决这个问题

arcgis js api官网介绍kml图层的地址: https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-KMLLayer.html从文档里看到kml图层有诸多限制,比较重要的两点是: 1、不能在三维场景(SceneView&#xff09…

python趣味编程-5分钟实现一个贪吃蛇游戏(含源码、步骤讲解)

Python 贪吃蛇游戏代码是用 Python 语言编写的。在这个贪吃蛇游戏中,Python 代码是增强您在创建和设计如何使用 Python 创建贪吃蛇游戏方面的技能和才能的方法。 Python Tkinter中的贪吃蛇游戏是一个简单干净的 GUI,可轻松玩游戏。游戏设计非常简单,用户不会觉得使用和理解…

【旅游行业】Axure旅游社交平台APP端原型图,攻略门票酒店民宿实战模板

作品概况 页面数量:共 110 页 兼容软件:Axure RP 9/10,不支持低版本 应用领域:旅游平台,酒店住宿 作品申明:页面内容仅用于功能演示,无实际功能 作品特色 本作品为「旅游社交平台」移动端…

灵魂拷问std::enable_shared_from_this,揭秘实现原理

灵魂拷问std::enable_shared_from_this,揭秘实现原理 引言 在C编程中,使用智能指针是一种安全管理对象生命周期的方式。std::shared_ptr是一种允许多个指针共享对象所有权的智能指针。然而,当一个对象需要获取对自身的shared_ptr时&#xff0…

虹科示波器 | 汽车免拆检修 | 1994款凯迪拉克fleetwood车发动机无法起动

一、故障现象 一辆1994款凯迪拉克fleetwood车,搭载5.7L发动机(燃油系统采用进气歧管多点喷射,每个气缸都有独立的喷油器;点火系统只有一个点火线圈,带机械分电器和高压线),发动机无法起动。 二、…