当前位置: 首页 > news >正文

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.需要在多个对象间共享实现(可能使用引用计数),但同时需要对其他业务无感知。

相关文章:

23种设计模式之桥接模式

桥接模式 1、定义 桥接模式:将抽象部分与它的实现部分解耦,使得两者都能独立变化 2、桥接模式结构 Abstraction(抽象类):它是用于定义抽象类的,通常是抽象类而不是接口,其中定义了一个Imple…...

vuejs3+elementPlus后台管理系统,左侧菜单栏制作、跳转、默认激活菜单

制作&#xff1a; <script setup> import {useUserStore} from "/stores/userStore.js"; import {ref} from "vue";const userStore useUserStore() //默认激活菜单 const defaultMenu ref(/home) </script><template><el-menuact…...

代码随想录算法训练营第四十四天|LeetCode198 打家劫舍、LeetCode213 打家劫舍Ⅱ

题1&#xff1a; 指路&#xff1a;198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 思路与代码&#xff1a; 对于这个题&#xff0c;拿房屋i举例&#xff0c;我们需要考虑的是否确定偷取这个房屋&#xff0c;如果确定偷取这个房屋&#xff0c;那么我们将得到房屋i的金…...

Git进阶使用(图文详解)

文章目录 Git概述Git基础指令Git进阶使用一、Git分支1.主干分支2.其他分支2.1创建分支2.2查看分支1. 查看本地分支2. 查看远程分支3. 查看本地和远程分支4. 显示分支的详细信息5. 查看已合并和未合并的分支 2.3切换分支1. 切换到已有的本地分支2. 创建并切换到新分支3. 切换到远…...

Effective C++ 改善程序与设计的55个具体做法笔记与心得 4

四. 设计与声明 18. 让接口容易被正确使用&#xff0c;不易被误用 请记住&#xff1a; 好的接口很容易被正确使用&#xff0c;不容易被误用。你应该在你的所有接口中努力达成这些性质“促进正确使用”的办法包括接口的一致性&#xff0c;以及与内置类型的行为兼容。“阻止误…...

WordPress管理员后台登录地址修改教程,WordPress admin登录地址文件修改方法

我们使用WordPress时&#xff0c;管理员后台登录默认地址为“域名/wp-login.php”或“域名/wp-admin”&#xff0c;为了安全&#xff0c;一般会把此地址改掉&#xff0c;防止有人恶意来攻击咱的WordPress&#xff0c;今天出个WordPress后台登录地址修改教程&#xff0c;修改之后…...

Python基础教程(二十四):日期和时间

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…...

java面向对象(上)

一.面向对象与面向过程 1.面向过程 面向过程(procedure Oriented Programming),简称POP,主要思想就是将问题分解成一个个步骤去解决,把这个步骤称为函数. 典型语言:C语言 优点:可以大大简化代码 缺点:当代码量过大时,不方便维护 2.面向对象 面向对象(Object Oriented Pr…...

揭示SOCKS5代理服务器列表的重要性

在复杂的网络安全领域中&#xff0c;SOCKS5代理在保护在线活动方面发挥着关键作用。本文深入探讨了SOCKS5代理服务器列表的细节&#xff0c;探讨了它们的应用、优势以及在增强在线安全和隐私方面不可或缺的功能。 一、理解SOCKS5代理服务器列表 作为在客户端和服务器之间进行通…...

机器学习python实践——关于ward聚类分层算法的一些个人心得

最近在利用python跟着参考书进行机器学习相关实践&#xff0c;相关案例用到了ward算法&#xff0c;但是我理论部分用的是周志华老师的《西瓜书》&#xff0c;书上没有写关于ward的相关介绍&#xff0c;所以自己网上查了一堆资料&#xff0c;都很难说清楚ward算法&#xff0c;幸…...

从零制作一个docker的镜像

近期docker的镜像仓库不好用了&#xff0c;很多国内的源也无法使用了&#xff0c;所有今天给大家分享一下怎么从零制作一个CentOS镜像。 准备CentOS7最小环境 mkdir /centos7.9-root# 在该目录准备centos的最小环境 sudo yum --installroot/centos7.9-root --releasever7 ins…...

eclipse 老的s2sh(Struts2+Spring+Hibernate) 项目 用import导入直接导致死机(CPU100%)的解决

1、下载Apache Tomcat - Apache Tomcat 8 Software Downloads 图中是8.5.100的版本&#xff0c;下面的设置用的是另一个版本的&#xff0c;其实是一样。 2、先将Server配好&#xff0c;然后再进行导入操作。 2、选择jdk 当然&#xff0c;这里也可以直接“Download and instal…...

《米小圈动画汉字》汉字教育动画化:传统与创新的完美融合!

汉字&#xff0c;作为中华文化的瑰宝&#xff0c;承载着千百年来中华民族的智慧和思想。每一个汉字不仅仅是一个符号&#xff0c;更是一段历史的见证&#xff0c;一种文化的传承。在当今全球化的背景下&#xff0c;汉字教育面临着新的挑战与机遇。在这种背景下&#xff0c;如何…...

【LeetCode最详尽解答】11-盛最多水的容器 Container-With-Most-Water

欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家&#xff01; 链接&#xff1a; 11-盛最多水的容器 直觉 这个问题可以通过可视化图表来理解和解决。 通过图形化这个…...

redis 缓存jwt令牌设置更新时间 BUG修复

大家好&#xff0c;今天我又又又来了&#xff0c;hhhhh。 上文中 我们永redis缓存了token 但是我们发现了 一个bug &#xff0c;redis中缓存的token 是单用户才能实现的。 就是 我 redis中存储的键 名 为token 值 是jwt令牌 &#xff0c;但是如果 用户a 登录 之后 创建一个…...

nginx精准禁止特定国家或者地区IP访问

1、安装依赖 dnf -y install gcc-c libtool gd-devel pcre pcre-devel openssl openssl-devel zlib zlib-devel libmaxminddb-devel pcre-devel zlib-devel gcc gcc-c make git2、获取NGINX安装包并安装 wget https://nginx.org/download/nginx-1.26.1.tar.gz git clone http…...

单片机课设-基于单片机的电子时钟设计(仿真+代码+报告)

基于单片机的电子时钟设计 前言一、课设任务是什么?二、系统总体方案硬件设计2.1 系统硬件总体设计2.2 键盘电路设计2.3 DS1302实时时钟芯片电路设计2.4 复位电路2.5 LCD电路设计 三、软件设计3.1 主程序流程图3.2 主要程序设计代码3.3 修改时间函数3.4 扫描键盘函数 四、仿真…...

.net 6 api 修改URL为小写

我们创建的api项目&#xff0c;url是[Route(“[controller]”)]&#xff0c;类似这样子定义的。我们的controller命名是大写字母开头的&#xff0c;显示在url很明显不是很好看&#xff08;url不区分大小写&#xff09;。转换方式&#xff1a; var builder WebApplication.Crea…...

Windows电脑部署Jellyfin服务端并进行远程访问配置详细教程

文章目录 前言1. Jellyfin服务网站搭建1.1 Jellyfin下载和安装1.2 Jellyfin网页测试 2.本地网页发布2.1 cpolar的安装和注册2.2 Cpolar云端设置2.3 Cpolar本地设置 3.公网访问测试4. 结语 前言 本文主要分享如何使用Windows电脑本地部署Jellyfin影音服务并结合cpolar内网穿透工…...

rsync同步目录脚本

假设有两台服务器的示例 IP 地址为&#xff1a; Server A: 192.168.1.100Server B: 192.168.1.200 现在来解释如何使用这个脚本进行服务器之间文件夹内容的同步&#xff0c;保留路径和服务器信息的抽象化。 1. 脚本文件位置和权限 假设脚本文件位于 /root/script.sh&#x…...

AI辅助构建复古像素风Hacker News聚合器:全栈开发实战

1. 项目概述&#xff1a;一个AI驱动的复古风Hacker News聚合器最近在逛Hacker News的时候&#xff0c;我总感觉“Show HN”板块里那些有趣的个人项目像流星一样&#xff0c;刷一下就过去了&#xff0c;想回头再找特别费劲。作为一个喜欢折腾的开发者&#xff0c;我就在想&#…...

MCP Analytics Suite:用自然语言驱动AI数据分析,零代码生成专业报告

1. 项目概述&#xff1a;当AI助手遇上专业数据分析如果你和我一样&#xff0c;日常工作中需要处理大量的业务数据——可能是Shopify的订单报表、Stripe的支付流水&#xff0c;或者是一堆从各个渠道导出的CSV文件——那你一定体会过那种“数据在手&#xff0c;却无从下手”的焦虑…...

AI编程工具的内卷:Copilot、Cursor、通义灵码,谁能笑到最后?

当“内卷”的风吹到AI编程工具2026年&#xff0c;AI编程工具已不再是新鲜事物&#xff0c;而是开发者工具箱中的标配。从最初的代码补全&#xff0c;到如今的全栈智能体&#xff0c;这个赛道正经历着一场前所未有的“内卷”。GitHub Copilot、Cursor、通义灵码三足鼎立&#xf…...

感应照明技术:从工业到家用,一场技术降维的工程冒险

1. 项目概述&#xff1a;当感应照明技术走进寻常百姓家最近在整理一些老旧的行业资料时&#xff0c;翻到了2014年的一则新闻&#xff0c;讲的是当时一家初创公司“Finally Light Bulb Company”宣布要推出一款售价低于10美元的感应灯泡&#xff0c;用来替代传统的白炽灯。这让我…...

2026年选系统门窗,认准专业工厂的三大理由

系统门窗作为现代建筑节能与安全的重要组成&#xff0c;在2026年迎来了更高的性能需求。面对市场上琳琅满目的门窗品牌&#xff0c;消费者如何做出选择&#xff1f;一个关键标准是&#xff1a;是否选择专业工厂生产的系统门窗。专业工厂意味着更高的产品品质、更严格的工艺标准…...

从‘坍缩’到‘对齐’:用SimCSE解决BERT句子向量老难题,我的中文业务实验复盘

从语义坍缩到精准对齐&#xff1a;SimCSE在中文业务场景的实战指南 BERT模型在自然语言处理领域取得了巨大成功&#xff0c;但其原生句子向量存在一个令人头疼的问题——语义坍缩。简单来说&#xff0c;就是不同句子的向量在高维空间中倾向于聚集在一起&#xff0c;导致相似度计…...

HDiffPatch实际应用案例:APK文件差异化和Android应用商店优化

HDiffPatch实际应用案例&#xff1a;APK文件差异化和Android应用商店优化 【免费下载链接】HDiffPatch a C\C library and command-line tools for Diff & Patch between binary files or directories(folder); cross-platform; runs fast; create small delta/differentia…...

从好奇号火星着陆看复杂系统工程:天空起重机方案与工程管理启示

1. 项目概述&#xff1a;从“不可能”到“火星新地标”的工程壮举2012年8月6日&#xff0c;当“好奇号”火星车在盖尔陨石坑成功着陆&#xff0c;传回第一张火星地表照片时&#xff0c;整个喷气推进实验室&#xff08;JPL&#xff09;控制中心沸腾了。这不仅仅是一次成功的行星…...

绕过Cursor AI消费限额前端Bug:浏览器控制台脚本实现API直接管理

1. 项目概述与背景 最近在深度使用Cursor这款AI代码编辑器时&#xff0c;遇到了一个挺让人头疼的问题。Cursor的付费模式是典型的用量计费&#xff0c;也就是所谓的“按需付费”&#xff0c;这对于我们这些高频使用者来说&#xff0c;确实需要设置一个消费上限&#xff0c;以防…...

【CPO三维路径规划】豪猪算法CPO多无人机协同集群避障路径规划(目标函数:最低成本:路径、高度、威胁、转角)研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...