23种设计模式之桥接模式

桥接模式

1、定义

桥接模式:将抽象部分与它的实现部分解耦,使得两者都能独立变化

2、桥接模式结构

  • Abstraction(抽象类):它是用于定义抽象类的,通常是抽象类而不是接口,其中定义了一个Implementor类型的对象并可以维护该对象,它与Implementor之间具有关联关系,既可以包含抽象业务方法,也可以包含具体业务方法
  • RefinedAbstraction(扩充抽象类):扩充Abstraction,通常情况下它不再是抽象类而是具体类,在RefinedAbstraction中可以调用在Implementor中定义的业务方法
  • Implementor(实现类接口):它是定义实现类的接口,这个接口不一定要与Abstraction完全一致,事实上两个接口可以完全不同。一般而言,Implementor仅提供基本操作,而Abstraction定义的接口可能会做更多更复杂的操作。通过关联关系,在Abstraction中不仅拥有自己的方法,还可以调用到Implementor中定义的方法,使用关联关系来替代继承关系
  • ConcreteImplementor(具体实现类):它实现了Implementor接口

在这里插入图片描述

3、示例

Abstraction 创建Person抽象类

public abstract class Person {private Clothing clothing;private String type;public Clothing getClothing() {return clothing;}public void setClothing(Clothing clothing) {this.clothing = clothing;}public void setType(String type) {this.type = type;}public String getType() {return this.type;}public abstract void dress();
}

RefinedAbstraction 创建Man、Lady类

public class Man extends Person{public Man() {setType("男人");}@Overridepublic void dress() {Clothing clothing = getClothing();clothing.personDressCloth(this);}
}
public class Lady extends Person {public Lady() {setType("女人");}@Overridepublic void dress() {Clothing clothing = getClothing();clothing.personDressCloth(this);}
}

Implementor 创建Clothing抽象类

public abstract class Clothing {public abstract void personDressCloth(Person person);
}

ConcreteImplementor 创建Jacket、Pants类

public class Jacket extends Clothing {@Overridepublic void personDressCloth(Person person) {System.out.println(person.getType() + "穿马甲");}
}
public class Pants extends Clothing {@Overridepublic void personDressCloth(Person person) {System.out.println(person.getType() + "穿裤子");}
}

测试类

public class Client {public static void main(String[] args) {Person man = new Man();Person lady = new Lady();Clothing jacket = new Jacket();Clothing pants = new Pants();jacket.personDressCloth(man);pants.personDressCloth(man);jacket.personDressCloth(lady);pants.personDressCloth(lady);}
}

输出结果

男人穿马甲
男人穿裤子
女人穿马甲
女人穿裤子

4、桥接模式优缺点

4.1优点
  • 分离抽象接口及其实现部分。使用对象间的关联关系解耦了抽象和现实之间固有的绑定关系,使抽象和实现可以沿着各自的维度来变化
  • 桥接模式在有些情况下可以取代多层继承方案,极大减少了子类的个数
  • 提高了系统的可扩展性,在两个变化维度中任意扩展一个维度都不需要修改原有系统,符合开闭原则
4.2缺点
  • 增加系统的理解与设计难度,关联关系建立在抽象层
  • 要求正确的识别出系统中的两个独立变化的维度,因此其适用范围具有一定的局限性

5、桥接模式的适用环境

1.不需要在抽象和它的实现部分之间有一个固定的绑定关系,在程序运行时刻实现部分程序可以被选择或者切换。

2.类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。 这时桥接模式可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。

3.对一个抽象的实现部分的修改应对其他业务不产生影响,即其他业务的代码不必重新编译。

4.需要在多个对象间共享实现(可能使用引用计数),但同时需要对其他业务无感知。

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

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

相关文章

Spark Core内核调度机制详解(第5天)

系列文章目录 如何构建DAG执行流程图 (掌握)如何划分Stage阶段 (掌握)Driver底层是如何运转 (掌握)确定需要构建多少分区(线程) (掌握) 文章目录 系列文章目录引言一、Spark内核调度(掌握)1.1、内容概述1.2、RDD的依赖1.3、DAG和Stage1.4、Spark Shuffl…

Dockerfile封装制作pytorch(tensorflow)深度学习框架 + jupyterlab服务 + ssh服务镜像

一:docker-hub官网寻找需求镜像 1.我们在https://hub.docker.com/官网找到要封装的pytorch基础镜像,这里我们以pytorch1.13.1版本为例 2.我们找到的这个devel版本的镜像(我们需要cuda的编译工具) pytorch版本是1.13.1,…

网络校时服务器:铁路对时有妙招

在信息高速发展的今天,铁路作为国家的经济大动脉,与广大市民生活息息相关,担负着运送大流量乘客、保证交通畅通的重任,为了保证列车的正点运行和乘客的行程,对时间精准度的要求是非常严格的。随着我国铁路的发展速度和…

【CRASH】freelist异常导致的异常地址访问

freelist异常导致的异常地址访问 问题现象初步分析继续深入新的发现沙盘推演寻找元凶分析代码后记 问题现象 项目一台设备几天内出现了两次crash,都是异常地址访问导致。 [66005.261660] BUG: unable to handle page fault for address: ffffff8881575110初步分析…

HttpSecurity

这是Spring Security提供的配置类, 用户保护基于HTTP的请求 ,通过HttpSecurity可以设置各种安全设置{认证,授权,CSRF保护,会话管理,异常处理} 主要功能和配置: 1.认证配置: 配置登录和登出功能,指定登录页面、登录处理 URL、成功和失败处理器等。配置认证方式,如表单登录、…

AOSP平台开发的利器——Android Studio for Platform

Android Studio for Platform (ASfP) 是一个为使用 Soong 构建系统构建的 Android 开源项目(AOSP)平台开发者而设计的 Android Studio IDE 版本。与标准 Android Studio 不同,ASfP 具有多语言支持,可以在同一 IDE 中编写 C、Kotli…

java是否可以从一个static方法内部发出对非static方法

在Java中,static方法(也被称为类方法或静态方法)是属于类的,而不是属于类的任何特定实例。由于这个原因,static方法不能直接访问非static(实例)方法或实例变量,因为非static方法和变…

分页插件bs_pagination与Bootstrap4、jQuery3.7.1不兼容的问题

问题场景: 开发环境: 项目:CRM IDE:intelij IDEA JDK: jdk21.0.2 JQuery:3.7.1 Bootstrap:4.6 项目中需要查询数据库中的数据,并且以分页显示的方式显示在页面上,前端页面用到了分页…

新书速览|Ubuntu Linux运维从零开始学

《Ubuntu Linux运维从零开始学》 本书内容 Ubuntu Linux是目前最流行的Linux操作系统之一。Ubuntu的目标在于为一般用户提供一个最新的、相当稳定的、主要由自由软件构建而成的操作系统。Ubuntu具有庞大的社区力量,用户可以方便地从社区获得帮助。《Ubuntu Linux运…

在Ubuntu16.04环境下使用Orbbec Astra Pro 运行ORB-SLAM2

(虚拟机和双系统都能正常运行,亲测有效) 1.Astra Pro驱动安装 1.1安装依赖: $ sudo apt-get install build-essential freeglut3 freeglut3-dev 1.2检查udev版本,需要libudev.so.1,如果没有则添加 #ch…

MySQL容器部署步骤

1、拉取MySQL镜像 docker pull mysql # 默认拉取最新版本docker pull mysql:5.7 # 拉取5.7版本docker pull mysql:8.0 # 拉取8.0版本 2、创建挂载目录 # 创建挂载目录 mkdir -p /home/mysql/conf/ # -p: 多级创建mkdir -p /home/mysql/log/mkdir -p /home/mysql/data/ 3…

Go Context

Context 介绍 Context 代表了协程的上下文,用以在父子协程之间传递控制信号,共享变量等操作// context.Context 接口 type Context interface {// 当Context自动取消或者到了取消时间被取消后返回Deadline() (deadline time.Time, ok bool)// 当Contex…

iOS Facebook SDK 安装

SDK地址 选择要下载的版本,然后下载动态库 FacebookSDK_Dynamic.xcframework.zip 接着手动把 ios-arm64_x86_64-simulator 里面的分离出 x86_64架构,然后动手把它合并到 arm64架构里面 最后拖到项目中,选择 “Embed & Sign”

高效、智能、安全:小型机房EasyCVR+AI视频综合监控解决方案

一、背景需求分析 随着信息技术的迅猛发展,小型机房在企事业单位中扮演着越来越重要的角色。为了确保机房的安全稳定运行,远程监控成为了必不可少的手段。 二、视频监控 视频监控是机房远程监控的重要组成部分。通过安装IP摄像机及部署视频监控系统Ea…

11.【机器学习】十大算法之一随机森林算法原理讲解

【机器学习】十大算法之一随机森林算法原理讲解 一摘要二个人简介三什么是随机森林?3.1 决策树3.2 集成方法3.2.1 Bagging方法3.2.2 Boosting方法 3.3 随机森林算法3.4 随机的含义 四案例演示一4.1 利用随机森林进行特征选择,然后使用SVR进行训练4.2 利用…

qt事件和连接TCP协议

QT网络聊天室服务器实现 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget),server(new QTcpServer(this))//给服务器指针实例化一个空间 {ui->setupUi(this); }Widget::~Widget() {d…

【华为HCIA数通网络工程师真题-构建互联互通的IP网络】

文章目录 一、选择题 一、选择题 1、缺省情况下,广播网络上OSPF协议RouterDeadInterval是? 40s (ospf 的 RouterDeadInterval 为四倍 hello time 时间,hello time 周期默认为10s,所以 RouterDeadInterval 默认为 40s …

『Z-Weekly Feed 08』加密资产观 | FHE应用前景 | OPAL协议

一位机构投资者的加密资产观 作者:Hongbo 01 💡TL;DR 在加密投资领域如何找到真正的“价值”:Crypto 作为一种新兴资产,应该找到一种区别于传统公司股票资产的估值方法,本文重点阐述了加密货币作为新的资产类型与传统资…

Artalk-CORS,跨域拦截问题

今天重新部署Artalk之后,遇到了CORS——跨域拦截的问题,卡了好一会记录一下。 起因 重新部署之后,浏览器一直提示CORS,之前在其他项目也遇到过类似的问题,原因就在于跨域问题。

Docker私有化仓库Harbor安装流程

1.搭建Docker私有仓库主要有以下几种方式 使用Docker官方提供的Registry镜像:Docker官方提供了一个用于构建私有镜像仓库的Registry镜像,只需将镜像下载并运行容器,然后暴露5000端口即可使用。可以通过修改Docker的配置文件daemon.json&#…