桥接模式的学习与使用

news2024/11/18 4:48:33

1、桥接模式的学习

  当你需要将抽象部分与实现部分解耦,使它们可以独立地变化,而又能够灵活地组合在一起时,可以使用桥接模式。桥接模式通过将抽象和实现部分分离,使它们可以独立地进行扩展和变化,同时又能够在运行时动态地组合起来。
  在桥接模式中,有两个主要的角色:抽象化(Abstraction)和实现化(Implementation)。抽象化角色定义了抽象部分的接口,并维护一个指向实现化角色的引用;实现化角色定义了实现部分的接口,并提供了具体的实现。
  桥接模式的核心思想是通过桥接接口(Bridge)将抽象部分和实现部分连接起来。抽象部分和实现部分可以独立地变化,而不会相互影响。这使得系统更加灵活,可以根据需求动态地选择和切换实现部分,同时也方便了系统的扩展和维护。
在这里插入图片描述
  以下是桥接模式的一般结构:

  • 抽象化(Abstraction):定义抽象部分的接口,维护一个指向实现化角色的引用。
  • 扩展抽象化(Refined Abstraction):抽象化的子类,对抽象化进行扩展,可以有自己的方法。
  • 实现化(Implementation):定义实现部分的接口,提供具体的实现。
  • 具体实现化(Concrete Implementation):实现化的具体实现类。

2、桥接模式的使用

  假设我们正在开发一个图形绘制应用程序。我们需要支持绘制不同类型的图形,例如矩形(Rectangle)和圆形(Circle),并且需要在不同的绘制设备上进行绘制,例如在屏幕上绘制(ScreenDrawer)和在打印机上绘制(PrinterDrawer)。

  请使用桥接模式设计一个图形绘制应用程序,使得可以根据需要选择不同的图形和不同的绘制设备,并实现相应的绘制功能。
抽象化图形类

public abstract class Graphical {
    protected DrawDevice drawDevice;

    public Graphical(DrawDevice drawDevice) {
        this.drawDevice = drawDevice;
    }

    /**
     * 开始绘制
     */
    abstract void startGraphical();
}

实现化绘制设备类

public abstract class DrawDevice {

    /**
     * 启动绘制设备
     */
    abstract void startDrawDevice();
}

打印机绘制设备类具体实现

public class PrinterDrawDevice extends DrawDevice {
    @Override
    void startDrawDevice() {
        System.out.println("在打印机上绘制");
    }
}

屏幕绘制设备类具体实现

public class ScreenDrawDevice extends DrawDevice {

    @Override
    void startDrawDevice() {
        System.out.println("在屏幕上绘制");
    }
}

圆形图形扩展抽象化类

public class CircleGraphical extends Graphical {

    public CircleGraphical(DrawDevice drawDevice) {
        super(drawDevice);
    }

    @Override
    void startGraphical() {
        drawDevice.startDrawDevice();
        System.out.println("开始绘制圆形");
    }
}

矩形图形扩展抽象化类

public class RectangleGraphical extends Graphical {

    public RectangleGraphical(DrawDevice drawDevice) {
        super(drawDevice);
    }

    @Override
    void startGraphical() {
        drawDevice.startDrawDevice();
        System.out.println("开始绘制矩形");
    }
}

客户端

public class BridgingClient {

    public static void main(String[] args) {
        PrinterDrawDevice printerDrawDevice = new PrinterDrawDevice();
        CircleGraphical circleGraphical = new CircleGraphical(printerDrawDevice);
        circleGraphical.startGraphical();

        RectangleGraphical rectangleGraphical = new RectangleGraphical(printerDrawDevice);
        rectangleGraphical.startGraphical();

        ScreenDrawDevice screenDrawDevice = new ScreenDrawDevice();
        circleGraphical = new CircleGraphical(screenDrawDevice);
        circleGraphical.startGraphical();

    }
}
在打印机上绘制
开始绘制圆形
在打印机上绘制
开始绘制矩形
在屏幕上绘制
开始绘制圆形

3、总结

  桥接模式适用于以下情况:

  1. 当需要将抽象部分和实现部分分离,并且它们可以独立地变化时。
  2. 当一个类存在两个或多个独立变化的维度时,使用继承会导致类爆炸的情况,此时可以考虑使用桥接模式。

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

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

相关文章

代码随想录二战day2

977有序数组的平方 力扣 思路: 第一: 和之前一样的,看见数组我们的第一想法就是使用双指针去解。这道题需要额外开辟一个答案数组去储存结果。 第二: 头指针指向第一个元素,尾指针指向最后一个元素。然后对两个元素分…

RocketMQ安装(Docker)

一、RocketMQ安装之docker 1.下载RockerMQ需要的镜像 docker pull rocketmqinc/rocketmq docker pull styletang/rocketmq-console-ng 2.启动NameServer服务 创建NameServer数据存储路径 mkdir -p /home/rocketmq/data/namesrv/logs /home/rocketmq/data/namesrv/store启动…

拾起王慧文的AI梦,美团冲向“光年之外”?

“十年,我需要休息休息,下一个十年,就托付给兄弟们了,感谢你们。” 2020年底,王慧文在朋友圈写下这句话时,外界本以为这位伴随中国互联网发展而持续创业20年的人物即将告别创业舞台。但是,一个…

Kubernetes创建集群—使用 Minikube 创建集群

一、使用 Minikube 创建集群 1、Kubernetes 集群 Kubernetes 协调一个高可用计算机集群,每个计算机作为独立单元互相连接工作。 Kubernetes 中的抽象允许你将容器化的应用部署到集群,而无需将它们绑定到某个特定的独立计算机。为了使用这种新的部署模型…

keepalived安装与使用(Nginx高可用)

一、Keepalived 简介🍉 1.什么是Keepalived ?🥝 Keepalived一个基于VRRP 协议来实现的 LVS 服务高可用方案,可以利用其来解决单点故障。一个LVS服务会有2台服务器运行Keepalived,一台为主服务器(MASTER&a…

Learn Mongodb DB功能命令索引等搜索 ⑤

作者 : SYFStrive 博客首页 : HomePage 📜: PHP MYSQL 📌:个人社区(欢迎大佬们加入) 👉:社区链接🔗 📌:觉得文章不错可以点点关注 &#x1f44…

layui框架学习(31:下拉菜单模块)

Layui的下拉菜单组件模块dropdown支持动态构建下拉菜单及右键菜单,不同于之前学习的页面元素中的菜单,后者主要是在页面中搭建菜单结构,然后通过设置layui提供的菜单相关的预设类对菜单结构进行样式渲染,而通过dropdown模块则是基…

【单片机】STM32单片机,RTC实时时钟,STM32F103C8T6,程序,万年历,数字时钟

文章目录 基础介绍rtc.hrtc.cmain.c 基础介绍 我以STM32F103C8T6为例,但STM32F103的RTC是通用的,STM32F103C8T6有一个原理图: https://qq742971636.blog.csdn.net/article/details/131288390 用纽扣电池给VBAT供电(要共地&…

基于matlab使用多类掩码区域的卷积神经网络对人和汽车的各个实例进行分段(附源码)

一、前言 此示例展示了如何使用基于多类掩码区域的卷积神经网络 (R-CNN) 对人和汽车的各个实例进行分段。实例分割是一种计算机视觉技术,您可以在其中检测和定位对象,同时为每个检测到的实例生成分割图。 此示例首先演示如何使用…

shardingsphere-proxy 实现postgresql的单库分表

1、docker 安装zookeeper 1、拉取镜像 docker pull zookeeper2、运行容器 docker run -d -e TZ"Asia/Shanghai" -p 2181:2181 -v /home/sunyuhua/docker/zookeeper:/data --name zookeeper --restart always zookeeper3、查看容器是不是运行成功 docker exec -i…

Spring Boot 中的 @SendTo 注解

Spring Boot 中的 SendTo 注解 在 Spring Boot 中,SendTo 注解是一个非常有用的注解,它可以用于实现 WebSocket 的消息转发功能。本文将介绍 SendTo 注解的原理、使用方法和示例代码。 什么是 SendTo 注解 SendTo 注解是 Spring Boot 中用于将消息发送…

个人和企业如何有效保护IP地址?

随着互联网的快速发展,个人和企业对于保护IP地址的重要性越来越清晰。为了帮助读者更好地了解如何有效保护IP地址,以下将介绍几种方法,并提供一些相关的数据和专家意见。 使用防火墙是保护IP地址的一个重要手段。防火墙可以监控和过滤网络流量…

react native 使用Native Module、Intent、广播接收器 实现两个app之间的相互通信

一、react native版本环境: “react”: “18.1.0”, “react-native”: “0.70.6”, “node”: "14.18.2 二、发送端步骤: 在A app中注册一个Native Module模块,使用Intent 连接B app,sendBroadcast 发送广播传递数据。 (1)首先在 /android/app/src/main/java/com/j…

ASP.NET Core MVC从入门到精通[PDF版]

随着技术的发展,ASP.NET Core MVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生&#xff0c…

three.js点材质(PointsMaterial)常用属性设置

一、前景回顾 上一章节简单介绍了下怎么使用点材质和点对象创建物体点对象和点材质介绍 点材质和点对象基本运用示例代码: import * as THREE from "three"; // 导入轨道控制器 import { OrbitControls } from "three/examples/jsm/controls/Orbit…

A核与M核异构通信过程解析

现在越来越多的产品具有M core和A core的异构架构,既能达到M核的实时要求,又能满足A核的生态和算力。比如NXP的i.MX8系列、瑞萨的RZ/G2L系列以及TI的AM62x系列等等。虽然这些处理器的品牌及性能有所不同,但多核通信原理基本一致,都…

Linux操作系统配置代理服务器

PS:本文只是针对Linux操作系统对于代理服务器的配置操作,不涉及广告 1.代理的概念 代理服务器英文全称是Proxy Server,其功能就是代理网络用户去取得网络信息。形象的说:它是网络信息的中转站。在一般情况下,我们使用网络浏览器直…

华为智能高校出口安全解决方案(1)

华为智能高校出口安全解决方案(1) 视频链接方案背景需求分析高校园区网概述高校园区网全景高校出口场景介绍高校出口整体需求分析业务安全需求攻击防御需求运维审计需求 方案规划华为智能高校出口安全解决方案架构华为智能高校出口安全解决方案功能划分业…

(二)Qt QGraphicsScene模块实现圆点绘制在所有窗体的最前方,实现圆点的“彩色拖尾”效果以及“选中方框”效果

系列文章目录 通过Qt实现手势识别控制软件操作相关系列技术方案 (一)Qt 将某控件、图案绘制在最前面的方法,通过QGraphicsScene模块实现 (二)Qt QGraphicsScene模块实现圆点绘制在所有窗体的最前方,实现圆…

强化学习从基础到进阶-案例与实践[5.1]:Policy Gradient-Cart pole游戏展示

强化学习从基础到进阶-案例与实践[5.1]:Policy Gradient-Cart pole游戏展示 强化学习(Reinforcement learning,简称RL)是机器学习中的一个领域,区别与监督学习和无监督学习,强调如何基于环境而行动&#x…