桥接模式Bridge

news2024/9/21 19:02:36

1.意图:将抽象部分与其实现部分分离,使它们都可以独立地变化。
2.结构
在这里插入图片描述
Abstraction定义抽象类的接口,维护一个指向Implementor类型对象的指针;
RefinedAbstraction扩充由Abstraction定义的接口;
Implementor定义实现类的接口,该接口不一定要与Abstraction的接口完全一直;事实上这两个接口可以完全不同。一般来说,Implementor接口仅提供基本操作,而Abstraction定义了基于这些基本操作的较高层次的操作;
ConcreteImplementor实现Implementor接口并定义它的具体实现。
3.适用性:
不希望在抽象和它的实现部分之间有一个固定的绑定关系。例如,这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换;
类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这是Bridge模式使得开发者可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充;
对一个抽象的实现部分的修改应对客户不产生影响,即客户代码不必重新编译。
C++想对客户完全隐蔽抽象的实现部分;
有许多类要生成的类层次结构;
想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。
代码案例
某图像预览程序要求能够查看BMP、JPEG和GIF三种格式的文件,且能够在Windows和Linux两种操作系统上运行。程序需具有较好的扩展性以支持新的文件格式和操作系统。为满足上述需求并减少所需生成的子类数目,现采用桥接模式进行设计。
软件设计师考试2017年下半年下午题第6题

/**
 * 桥接模式
 */
public class Bridge {
    public static void main(String[] args) {
        Implementor implementor1 = new LinuxImp();
        Implementor implementor2 = new WinImpl();
        //在Linux系统上查看demo.gif图像文件
        Image image1 = new GIFImage();
        image1.setImpl(implementor1);
        image1.parseFile("demo.gif");
        //在Windows系统上查看demo.gif图像文件
        image1.setImpl(implementor2);
        image1.parseFile("demo.gif");
        //在Linux系统上查看demo.gif图像文件
        Image image2 = new BMPImage();
        image2.setImpl(implementor1);
        image2.parseFile("demo.bmp");
        //在Windows系统上查看demo.gif图像文件
        image2.setImpl(implementor2);
        image2.parseFile("demo.bmp");
    }
}
class Matrix{//各种格式的文件最终都被转化为像素矩阵
    private String fileName;//文件名称

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }
}
abstract class Implementor{
    public abstract void doPaint(Matrix m);//显示像素矩阵m
}
class WinImpl extends Implementor{
    @Override
    public void doPaint(Matrix m) {
        System.out.println("调用windows系统的绘制函数绘制像素矩阵"+m.getFileName());
    }
}
class LinuxImp extends Implementor{
    @Override
    public void doPaint(Matrix m) {
        System.out.println("调用Linux系统的绘制函数绘制像素矩阵"+m.getFileName());
    }
}
abstract class Image{
    protected Implementor impl;
    public void setImpl(Implementor impl){
        this.impl = impl;
    }
    public abstract void parseFile(String fileName);
}
class GIFImage extends Image{
    @Override
    public void parseFile(String fileName) {
        //此处解析BMP文件并获得一个像素矩阵对象m
        Matrix m = new Matrix();
        m.setFileName(fileName);
        impl.doPaint(m);//显示像素矩阵m
    }
}
class BMPImage extends Image{
    @Override
    public void parseFile(String fileName) {
        //此处解析BMP文件并获得一个像素矩阵对象m
        Matrix m = new Matrix();
        m.setFileName(fileName);
        impl.doPaint(m);//显示像素矩阵m
    }
}
class JPEGImage extends Image{
    @Override
    public void parseFile(String fileName) {
        //此处解析BMP文件并获得一个像素矩阵对象m
        Matrix m = new Matrix();
        m.setFileName(fileName);
        impl.doPaint(m);//显示像素矩阵m
    }
}

运行结果
在这里插入图片描述

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

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

相关文章

ruoyi系统启动

系统概要 系统分为2部分前端vue —— vscode,后端spring-boot —— eclipse 系统依赖服务: 数据库——mysql 缓存——redis 启动顺序 mysql ——> redis ——> eclipse ——> vscode mysql 启动 windowQ 输入 service 打开服务管理 找到…

[附源码]Python计算机毕业设计Django实验室管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

Windows下免杀思路总结

1.简介 在安全厂商日趋成熟的背景下,编写免杀马的难度和成本日益增长。好用新兴的开源项目在短时间内就被分析并加入特征库。笔者调研了部分开源项目,其中也有项目做了类似的分析 [1],目前能够免杀的项目初步统计,其特征一是star…

MySQL8.0 show create view BUG解析

GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。作者:崔弘晨作者介绍:诺亚财富数据库DBA 擅长数据库SQL优化,喜欢分享技术文章来源:社区投稿…

【Linux】详解Linux权限管理

文章目录 1.Shell命令以及运行原理 2.Linux权限的概念 2.1用户介绍 2.2用户切换指令 su 当前所处目录不变 当前所处目录改变 3.Linux 权限管理 3.1文件访问者的分类 3.1.1 拥有者 3.1.2 所属组 3.1.3 other 3.1.4 总结 3.2文件类型和访问权限 3.2.1文件类型 3.2…

基于 SE (2)-XYZ 约束的地面车辆视觉-轮速计定位与建图

摘要-本文关注的是地面车辆使用轮速计和单目视觉传感器的SLAM问题,为了改进基于视觉的地面车辆估计精度,研究人员利用了近似平面运动的约束,通常将其作为 SE (3)位姿的随机约束来实现,在本文中提出了一个更简单的算法,…

如何利用数字创新使您的企业脱颖而出

如何利用数字创新使您的企业脱颖而出 数字创新并非易事,但它会对您的企业内部和外部产生积极影响。 然而,数字化的方式如此之多,企业很难决定将注意力集中在哪里。 本文的目的是概述数字创新的战略方法。这种方法让您重新审视现在与未来的…

订单管理是客户关系管理的有效延伸,那么订单管理系统对于企业的作用有哪些呢?

订单管理是客户关系管理的有效延伸,能更好的把个性化,差异化服务有机的融入到客户管理中去,能推动经济效益和客户满意度的提升。与此同时,随着电商的发展与经济全球化的影响,不少企业的订单量都是暴增状态。海量订单数…

【读书笔记】高级FPGA设计之高速率结构设计

目录 写在前面 1. 概念介绍 2. 高速度结构设计 2.1 高流量 2.2 低延时 2.3 优时序 2.3.1 组合逻辑插寄存器 2.3.2 并行结构 2.3.3 展平逻辑结构 2.3.4 寄存器平衡 2.3.5 重新安排路径 3. 总结 写在前面 本博客为阅读书籍《高级FPGA设计》的部分读书笔记&#xff0c…

XXL-JOB核心源码解读及时间轮原理剖析

你好,今天我想和你分享一下XXL-JOB的核心实现。如果你是XXL-JOB的用户,那么你肯定思考过它的实现原理;如果你还未接触过这个产品,那么可以通过本文了解一下。 XXL-JOB的架构图(2.0版本)如下: 它…

易基因|ChIP-seq等实验揭示CHD6转录激活前列腺癌通路的关键功能 | 肿瘤耐药研究

易基因|ChIP-seq等实验揭示CHD6转录激活前列腺癌通路的关键功能 | 肿瘤耐药研究 大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 2022年11月21日,北京大学基础医学院赵东宇研究员、美国休斯敦卫理公会研究所Min…

详解 Redis 中 big keys 发现和解决

在使用 Redis 时,可能会出现请求响应慢、网络卡顿、数据丢失的情况。排查问题的时候,发现是 big keys 的问题。 什么是 big keys 在 Redis 中,一个字符串类型最大可以达到 512MB,其他非字符串类型的集合类型(list、set、hash、z…

网络常见面试题

1.简述OSI七层模型主要功能 OSI---开放(协议公有)系统互联参考模型 解决数据传输不兼容性 IS0---国际标准化组织---定义->OSI 7层(基本功): 应用层:人机交互的接口,接收应用程序的数据…

【AI】Python 实现粒子群算法

粒子群算法 1. 题目介绍 粒子群算法,其全称为粒子群优化算法 (Particle Swarm Optimization, PSO) 。它是通过模拟鸟群觅食行为而发展起来的一种基于群体协作的搜索算法。粒子群算法属于启发式算法也叫智能优化算法,其基本思想在于通过群体中个体之间的…

零入门容器云网络-6:基于veth pair、namespace以及路由技术,实现跨主机命名空间之间的通信测试案例

已发表的技术专栏(订阅即可观看所有专栏) 0  grpc-go、protobuf、multus-cni 技术专栏 总入口 1  grpc-go 源码剖析与实战  文章目录 2  Protobuf介绍与实战 图文专栏  文章目录 3  multus-cni   文章目录(k8s多网络实现方案) 4  gr…

ROS系列:第六章 机器人建模

文章目录六、机器人系统仿真1.概述仿真优势:仿真缺陷:2. URDF集成Rviz基本流程1.创建功能包,导入依赖2.编写 URDF 文件3.在 launch 文件中集成 URDF 与 Rviz4.在 Rviz 中显示机器人模型5.优化 rviz 启动3. URDF语法详解3.1 URDF语法详解01_robotrobot1.属性2.子标签…

Promethus实操部署ARM架构 麒麟系统

由于有个地市局的等保测评要求安装监控软件,实操安装普罗米修斯和Zabbix,原本想安装Zabbix在本地安装非常顺利,但是服务器是华为鹏鲲的、ARM架构,Zabbix的有些东西找不到ARM的,所以两个都尝试了下。本篇讲解下Promethu…

协同过滤推荐算法

协同过滤:利用集体智慧,借鉴相关人群的观点进行推荐。 过去兴趣相似的用户在未来的兴趣也会相似;相似的用户会产生相似的历史行为数据。 根据历史行为,产生相似用户,分析出推荐结果。 用一句大白话说,其实也…

Android请求应用权限

文章目录前言参考一、请求应用权限基本原则二、请求权限的流程(官网摘抄)三、请求权限编码1.允许系统管理权限请求代码2.自行管理权限请求代码总结前言 学习Android为什么需要动态申请危险权限 学会Android应用危险权限申请的方式 参考 Android官方文档…

8 种 Python 定时任务的解决方案

在日常工作中,我们常常会用到需要周期性执行的任务,一种方式是采用 Linux 系统自带的 crond 结合命令行实现,另外一种方式是直接使用Python。 最近我整理了一下 Python 定时任务的实现方式,内容较长,建议收藏后学习&a…