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

Java设计模式(桥接模式)

定义

       将抽象部分与它的实现部分解耦,使得两者都能够独立变化。

角色

       抽象类(Abstraction):定义抽象类,并包含一个对实现化对象的引用。

       扩充抽象类(RefinedAbstraction):是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色的业务方法。

       实现类接口(Implementor):定义实现化角色的接口,供扩展抽象化角色调用。

       具体实现类(ConcreteImplementor):给出实现化角色的具体实现。

优点

       分离抽象接口及其实现部分,使得抽象和实现可以沿着各自的维度来变化。

       可以取代多层继承方案,极大地减少了子类的个数

       提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,不需要修改原有系统,符合开闭原则

缺点

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

       正确识别出系统中两个独立变化的维度并不是一件容易的事情

适用场景

       需要在抽象化和具体化之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系

       抽象部分和实现部分可以以继承的方式独立扩展而互不影响

       一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立地进行扩展

       不希望使用继承或因为多层继承导致系统类的个数急剧增加的系统

案例

       某软件公司要开发一个跨平台图像浏览系统,要求该系统能够显示BMP、JPG、GIF、PNG等多种格式的文件,并且能够在Windows、Linux、UNIX等多个操作系统上运行。系统首先将各种格式的文件解析为像素矩阵(Matrix),然后将像素矩阵显示在屏幕上,在不同的操作系统中可以调用不同的绘制函数来绘制像素矩阵。另外,系统需具有较好的扩展性,以便在将来支持新的文件格式和操作系统。试使用桥接模式设计该跨平台图像浏览系统。

类图

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MySQL笔记-基础篇(二):多表查询
  • XetHub 加入 Hugging Face!
  • 基于OpenMV与STM32的数据通信项目(代码开源)
  • 鸿蒙HarmonyOS开发:常用布局及实用技巧
  • MYSQL必知必会 - (一)了解sql + (二)MySQL简介
  • 《RT-DETR》论文笔记
  • 手写mybatis拦截器自动填充数据
  • Midjourney进阶-创建与管理自己的专属参数
  • vscode 目录管理
  • (南京观海微电子)——示波器使用介绍
  • Linux-Haproxy搭建Web群集
  • Android SurfaceFlinger——Vsync监听逻辑(五十三)
  • 重启人生计划-大梦方醒
  • lsync+nfs+rsync
  • TCP回显服务器
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Angularjs之国际化
  • iOS 系统授权开发
  • Iterator 和 for...of 循环
  • JavaScript HTML DOM
  • JS笔记四:作用域、变量(函数)提升
  • Lucene解析 - 基本概念
  • MySQL主从复制读写分离及奇怪的问题
  • ng6--错误信息小结(持续更新)
  • Promise面试题2实现异步串行执行
  • Python中eval与exec的使用及区别
  • vue:响应原理
  • web标准化(下)
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 微信开源mars源码分析1—上层samples分析
  • 我建了一个叫Hello World的项目
  • 主流的CSS水平和垂直居中技术大全
  • ​Java并发新构件之Exchanger
  • ​浅谈 Linux 中的 core dump 分析方法
  • #预处理和函数的对比以及条件编译
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (一)RocketMQ初步认识
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • ./和../以及/和~之间的区别
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .net 7和core版 SignalR
  • .Net Core 中间件与过滤器
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .NET MVC 验证码
  • .net 程序发生了一个不可捕获的异常
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .net6使用Sejil可视化日志
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • .net通过类组装数据转换为json并且传递给对方接口