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

简谈设计模式之桥接模式

桥接模式是一种结构型设计模式, 它将抽象部分和它的实现部分分离, 使它们可以独立变化. 这意味着可以改变它的抽象和它的实现, 而不会相互影响

桥接模式结构
  • 抽象 (Abstraction): 定义抽象类, 并包含一个对实现类对象的引用
  • 拓展抽象 (Refined Abstraction): 拓展抽象类, 通过组合的方式调用实现类的方法
  • 实现 (Implementor): 定义实现类的接口, 但不具体实现, 它仅提供一个接口, 供具体实现类进行实现
  • 具体实现 (ConcreteImplementor): 具体实现Implementor接口
桥接模式实现

假设有一个画图程序, 需要渲染不同图形, 同时还需要在不同操作系统上渲染, 可以使用桥接模式来实现这个程序

// Implementor
interface DrawingAPI {void drawCircle(double x, double y, double radius);
}// ConcreteImplementorA
class DrawingAPI1 implements DrawingAPI {@Overridepublic void drawCircle(double x, double y, double radius) {System.out.println("API1.circle at " + x + ":" + y + " radius " + radius);}
}// ConcreteImplementorB
class DrawingAPI2 implements DrawingAPI {@Overridepublic void drawCircle(double x, double y, double radius) {System.out.println("API2.circle at " + x + ":" + y + " radius " + radius);}
}// Abstraction
abstract class Shape {protected DrawingAPI drawingAPI;protected Shape(DrawingAPI drawingAPI) {this.drawingAPI = drawingAPI;}public abstract void draw();                               // low-levelpublic abstract void resizeByPercentage(double pct);       // high-level
}// RefinedAbstraction
class CircleShape extends Shape {private double x, y, radius;public CircleShape(double x, double y, double radius, DrawingAPI drawingAPI) {super(drawingAPI);this.x = x;this.y = y;this.radius = radius;}@Overridepublic void draw() {drawingAPI.drawCircle(x, y, radius);}@Overridepublic void resizeByPercentage(double pct) {radius *= (1.0 + pct / 100.0);}
}// Client
public class BridgePatternDemo {public static void main(String[] args) {Shape[] shapes = new Shape[] {new CircleShape(1, 2, 3, new DrawingAPI1()),new CircleShape(5, 7, 11, new DrawingAPI2()),};for (Shape shape : shapes) {shape.resizeByPercentage(2.5);shape.draw();}}
}

DrawingAPI 是实现接口,定义了具体的绘制操作。

DrawingAPI1DrawingAPI2 是具体实现类,分别实现了具体的绘制操作。

Shape 是抽象类,包含一个 DrawingAPI 的引用。

CircleShape 是具体的图形类,实现了具体的绘制操作,并委托给 DrawingAPI。

BridgePatternDemo 是客户端代码,展示了如何使用桥接模式来绘制不同的图形。

优点:

  • 分离抽象接口与实现
  • 遵循了开闭原则
  • 提高系统拓展性
  • 实现细节对客户是透明的

缺点:

  • 增加了系统设计难度
  • 增加了代码的难度

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 《绝区零》公测“翻车”
  • 浅析stm32启动文件
  • 图示 JVM 可达性分析算法
  • opencv—常用函数学习_“干货“_4
  • prompt第四讲-fewshot
  • ES6 Class 的继承(十一)
  • 《Linux系统编程篇》vim的使用 ——基础篇
  • 论文复现丨物流中心选址问题:蜘蛛猴算法求解
  • 摄像头 RN6752v1 视频采集卡
  • 【机器学习】Scoring Model Scores: 理解、设计与优化评分模型
  • OpenWrt安装快速入门指南
  • JS之在函数中返回匿名函数的用法
  • tessy 集成测试:小白入门指导手册
  • Ubuntu 编译和运行ZLMediaKit
  • samba服务、安装-smbpasswd工具、pdbedit工具、testparm工具
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • CSS相对定位
  • gcc介绍及安装
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • linux学习笔记
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • Vim Clutch | 面向脚踏板编程……
  • Vultr 教程目录
  • 爱情 北京女病人
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 驱动程序原理
  • 人脸识别最新开发经验demo
  • 如何进阶一名有竞争力的程序员?
  • 正则表达式小结
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • Android开发者必备:推荐一款助力开发的开源APP
  • ​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​十个常见的 Python 脚本 (详细介绍 + 代码举例)
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #VERDI# 关于如何查看FSM状态机的方法
  • ${ }的特别功能
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (¥1011)-(一千零一拾一元整)输出
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (1) caustics\
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (二)PySpark3:SparkSQL编程
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (转)h264中avc和flv数据的解析
  • (转)socket Aio demo