二十三种设计模式第十一篇--桥接模式

news2024/11/17 11:31:40

好久没写博客了,自从进入6月份,毕业季,全是在忙毕业的事情,都没怎么学习代码软件工程知识了,这二十三种设计模式还是得学完哈!持之以恒,我本来为了学这二十三种设计模式的初衷是为了顺利度过软考,但是后边发现我这个职业生活中,还是将这二十三种设计模式全部搞懂的好!就举一个例子,学Java的,Spring 框架中有多少种设计模式?

在spring框架中,使用了多种设计模式来实现不同的功能和解决不同的问题。
我只例举一些我见到过的设计模式:

  1. 单例模式:Spring容器默认使用单例模式管理Bean对象,确保每个Bean只有一个实例。

  2. 工厂模式:Spring使用工厂模式来创建和管理Bean对象,通过BeanFactory或ApplicationContext来获取Bean实例。

  3. 代理模式:Spring AOP(面向切面编程)使用了代理模式来实现横切关注点的功能,如事务管理、日志记录等。

  4. 观察者模式:Spring的事件机制使用了观察者模式,通过事件发布和监听来实现模块之间的解耦。

  5. 模板方法模式:Spring的JdbcTemplate和HibernateTemplate等模板类使用了模板方法模式,将一些通用的操作封装在模板方法中,具体实现由子类来完成。

  6. 适配器模式:Spring的适配器模式用于将不同的接口适配成统一的接口,如HandlerAdapter用于适配不同类型的Controller。

  7. 建造者模式:Spring的BeanDefinitionBuilder和BeanDefinitionReader等类使用了建造者模式,通过链式调用来构建Bean定义。

  8. 迭代器模式:Spring的集合类如List、Set等都实现了迭代器模式,提供了统一的遍历方式

今天我们来讲解的是桥接模式,桥接模式,实际上是将抽象化和实现化解耦,让两者可以独立的进行变化

桥接模式
根据以上UML图我们来设计一个桥接模式代码。

来先上接口

/**
 * 实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用
 * 使用 DrawAPI 接口创建抽象类 Shape
 */
public interface DrawAPI {

   public void drawCircle(int radius, int x, int y);

}

根据接口撰写实现类

/**
 *  具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。
 * 创建实现了 DrawAPI 接口的实体桥接实现类
 */
public class RedDraw implements DrawAPI {
   @Override
   public void drawCircle(int radius, int x, int y) {
      System.out.println("Drawing Circle[ color: red, radius: "
         + radius +", x: " +x+", "+ y +"]");
   }
}

/**
 *  具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。
 * 创建实现了 DrawAPI 接口的实体桥接实现类
 */
public class GreenDraw implements DrawAPI {
   @Override
   public void drawCircle(int radius, int x, int y) {
      System.out.println("Drawing Circle[ color: green, radius: "
         + radius +", x: " +x+", "+ y +"]");
   }

/**
 * 扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
 * 实现了 Shape 抽象类的实体类
 */
public class Circle extends Shape {
   private int x, y, radius;
 
   public Circle(int x, int y, int radius, DrawAPI drawAPI) {
      super(drawAPI);
      this.x = x;  
      this.y = y;  
      this.radius = radius;
   }
 
   @Override
   public void draw() {
      drawAPI.drawCircle(radius,x,y);
   }
}

/**
 * 抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用
 * 创建桥接实现接口
 */
public abstract class Shape {
   //有一个抽象角色的引用, 实现组合关系.
   protected DrawAPI drawAPI;

   protected Shape(DrawAPI drawAPI){
      this.drawAPI = drawAPI;
   }

   //具体的绘制由子类实现》
   public abstract void draw();  
}

/**
 * 测试类
 * 使用 Shape 和 DrawAPI 类画出不同颜色的圆
 */
public class BridgePatternDemo {

   public static void main(String[] args) {

      Shape redCircle = new Circle(100,100, 10, new RedDraw());
      Shape greenCircle = new Circle(100,100, 10, new GreenDraw());
 
      redCircle.draw();
      greenCircle.draw();
   }
}

至此,桥接模式的代码书写完整。

注意,这里再次提醒一下,桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化。桥接模式通过将抽象和实现分离,可以使它们可以独立地进行扩展和变化,而不会相互影响。

在桥接模式中,抽象部分和实现部分分别由抽象类和实现类来表示。抽象类定义了抽象部分的接口,而实现类则实现了抽象部分的接口。抽象类中包含一个指向实现类的引用,通过这个引用,抽象类可以调用实现类中的方法。

桥接模式的核心思想是将抽象部分和实现部分分离,使它们可以独立地变化。这样一来,当需要新增一种抽象部分或实现部分时,只需要新增对应的抽象类或实现类即可,而不需要修改已有的代码。这种设计思想符合开闭原则,可以提高系统的可扩展性和可维护性。

桥接模式的应用场景包括:

当一个类存在两个或多个独立变化的维度时,可以使用桥接模式将它们分离,使它们可以独立地变化。

当一个类需要在运行时切换不同的实现时,可以使用桥接模式。

当一个类需要通过继承来扩展功能时,可以使用桥接模式,而不是使用多层继承。

总结起来,桥接模式通过将抽象部分和实现部分分离,使它们可以独立地变化,提高了系统的可扩展性和可维护性。它适用于存在多个独立变化的维度的场景,以及需要在运行时切换不同实现的场景。

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

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

相关文章

Azkaban的安装教程

Azkaban的安装教程 文章目录 Azkaban的安装教程写在前面集群模式安装下载安装包上传 **tar** 包解压配置 **MySQL**配置 **Executor Server**编辑 azkaban.properties同步 azkaban-exec到所有节点启动 executor server激活 executor **配置** **Web Server**编辑 azkaban.prope…

短视频seo源码搭建技术分享

一、目录及主要文件说明 bootstrap目录,存放框架引导及启动文件,非底层改动,无需修改。其中的functions.inc中可以定义一些全局函数error目录,存放404、500等常见错误模板文件,非需勿动includes目录,drupal…

SpringBoot 如何使用 JProfiler 进行性能测试

SpringBoot 如何使用 JProfiler 进行性能测试 在 SpringBoot 应用程序中,我们可以使用 JProfiler 进行性能测试。JProfiler 是一款专业的 Java 性能分析工具,可以帮助我们识别和解决应用程序的性能问题。使用 JProfiler 可以让我们更加准确地测试代码的…

C语言进阶教程(字符串深入)

文章目录 前言一、字符数组赋值注意事项二、混淆点三、字符串字面量和字符数组的区别四、字符串长度总结 前言 其实在C语言中是没有真正的字符串的,在C语言中字符串都是使用字符数组来完成的。 一、字符数组赋值注意事项 在C语言中,字符数组&#xff…

[RocketMQ] Producer生产者启动源码 (五)

DefaultMQProducer的关系图: 文章目录 1.创建DefaultMQProducer实例2.start启动生产者2.1 getOrCreateMQClientInstance获取或者创建MQClientInstance2.2 registerProducer注册生产者2.3 start启动MQClientInstance2.4 startScheduledTask启动各种定时任务2.4.1 updateTopicRou…

【Linux】切换内核版本(Centos)

1.查看服务器已安装的所有内核版本 awk -F\ $1"menuentry " {print i " : " $2} /etc/grub2.cfg0 : CentOS Linux (3.10.0-1160.83.1.el7.x86_64) 7 (Core) 1 : CentOS Linux (3.10.0-1160.80.1.el7.x86_64) 7 (Core) 2 : CentOS Linux (3.10.0-1127.el7.…

求最小函数依赖集(例题讲解)超详细,易理解

在关系R<U,F>中&#xff0c;UABCDEG F{BG->C&#xff0c;BD->E,DG->C,ADG->BC,AG->B,B->D} 先进行第一大步&#xff1a; 先看右边&#xff1a; 如果有BG->C,G-->C,因为单G就可以推出C了就不需要BG--->C了&#xff0c;可以把BG--->C这个…

Segment Anything Model(SAM)

Segment Anything Model&#xff08;SAM&#xff09;是Facebook Research近来开源的一种新的图像分割任务、模型。Segment Anything Model&#xff08;SAM&#xff09;可以从输入提示&#xff08;如点或框&#xff09;生成高质量的对象掩模&#xff0c;并可用于生成图像中所有对…

1、一条 SQL 查询语句是如何执行的?

基础篇 第一课、一条 SQL 查询语句是如何执行的&#xff1f; 下面是 MySQL 的基本架构示意图&#xff0c;从中可以清楚地看到 SQL 语句在 MySQL 的各个功能模块中的执行过程。 大体来说&#xff0c;MySQL 可以分为 Server 层和存储引擎层两部分。 Server 层包括连接器、查询缓存…

AI近十年盘点:纵览AI发展历程,探寻AI未来走向

编者按&#xff1a;当我们回顾过去十年的人工智能发展历程时&#xff0c;可以看到一场现在还正在进行的变革&#xff0c;对我们的工作方式、商业运营模式和人际交往行为都产生了深远的影响。从2013年的AlexNet到变分自编码器&#xff0c;再到最近的生成式大模型&#xff0c;人工…

Vue 2 - 常见面试题汇总大全

文章目录 一 基础知识1.vue 的生命周期1-1 钩子函数1-2 钩子函数的使用方法1-3 父子组件生命周期构造函数执行顺序 2 v-show 与 v-if v-for2-1.v-show 与 v-if 的区别2-2 v-if 和v-for的优先级 3.组件通信有哪些方式&#xff1f;4 computed和watch &#xff0c;有什么区别4-1.c…

西门子S7-1200定时器

一、西门子S7-1200定时器介绍 S7-1200的定时器为IEC定时器&#xff0c;用户程序中可以使用的定时器数量仅仅受CPU的存储器容量限制。 使用定时器需要使用定时器相关的背景数据块或者数据类型为IEC_TIMER&#xff08;或TP_TIME、TON_TIME、TOF_TIME、TONR_TIME&#xff09;的D…

别再弄混流程挖掘、BPM和BI

信息时代以来&#xff0c;各类信息系统不仅在企业中得到了广泛的应用和普及&#xff0c;种类和选择伴随全球数字技术的发展也逐渐变得丰富多样。而随着数字化转型的不断深入&#xff0c;企业对系统管理的需求面临着全新的变化。 如何配置最适合当下业务的系统&#xff1f;这个…

Axure教程——图片轮播(纵向滚动)

本文介绍的时用Axure中的动态面板制作图片轮播之纵向滚动 一、预览效果 预览地址&#xff1a;https://c1s4i1.axshare.com 二、功能描述 图片纵向自动滚动播放 三、元件制作 拖入一个动态面板&#xff0c;命名为1&#xff0c;设置大小为375*155&#xff0c;并设置四个状态&…

文科生从0学Python转数据分析学习建议避坑指南

我本科是财务管理&#xff0c;文科专业&#xff0c;零基础学习Python转行数分后&#xff0c;现在我的日常工作都离不开它。 接下来&#xff0c;给各位跟我一样无编程经验的朋友一些学习的建议 目标导向&#xff1a;先搞清楚为啥要学 Python几乎可以做任何事&#xff0c;但我…

2023汽车供应链大会暨爱普搜采购商交流会

2023汽车供应链大会暨爱普搜采购商交流会 Automotive Supply Chain Conference & APSOTO Purchasing Exchange Meeting 补链强链 绿色发展--打造中国汽车供应链新生态 北京是我国汽车工业重地之一&#xff0c;产业实力雄厚&#xff0c;发展强劲。北京车企及零部件公司分布…

springboot高校宿舍报修管理系统计算机毕设 附源码83946

springboot高校宿舍报修管理系统 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实…

VUE L 事件处理 ⑤

目录 文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持✨ V u e j s Vuejs Vuejs E v e n t j s Eventjs Eventjs总结 文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持✨ ⡖⠒⠒⠒⠤⢄⠀⠀⠀…

Java反射机制以及应用

Java反射机制以及应用 1、Java反射 在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够获取到这个类的所有属性和方法&#xff0c;对于任意一个对象&#xff0c;都能够调用它的任意一个方法和属性(包括私有的方法和属性)&#xff0c;这种动态获取的信息以及动态调用对…

【推荐】免费PDF编辑修改软件排行榜Top11!

随着组织进入数字时代&#xff0c;他们需要处理大量数字文档&#xff0c;尤其是 PDF。PDF 是数字文档中使用最广泛的文件格式之一&#xff0c;能够编辑 PDF 文件至关重要。PDF编辑并不是任何软件都能轻松完成的。不过&#xff0c;网络上有大量免费、开源的 PDF 编辑软件可以帮助…