设计模式 - 桥接模式,就要这样学!

news2025/1/19 13:11:50

目录

开始

为什么引入桥接模式

桥接模式概述

桥接模式实现

桥接模式的扩展性


开始


为什么引入桥接模式

问题:针对 不同品牌 的 不同类型手机 实现 open、close、call 操作.

如果将来新增一个手机类型,例如 IPhone,就需要继续写对应的三个类(mini、pro、promax)...

如果将来新增一个手机参数,例如 promaxmax,就需要给每个手机类型都添加这个 参数类型...

为了解决这个问题,就引入了桥接模式~

桥接模式概述

桥接模式:是一种结构性设计模式,将抽象(Abstraction)和实现(Implementation)放在两个不同的类层次中,使两个层次可以独立改变.

主要角色如下:

  • 抽象:
    • 抽象类:就是真个桥接的桥梁,里面聚合了行为的 实现接口 .
    • 精确抽象:是具体的逻辑实体,通过父类中提供的聚合行为接口来完成不同的交互.
  • 行为:
    • 实现接口:这里就定义了实体的行为.  此接口被抽象类聚合.
    • 具体实现:实现了具体的实体行为.

桥接模式实现

以上述手机为例

a)实现接口,这里就定义了手机的行为

interface Phone {
    fun open()
    fun call()
    fun close()
}

b)具体实现,这里就是对手机的行为具体实现

class XiaoMi: Phone {
    override fun open() = println("xiaomi open")
    override fun call() = println("xiaomi call")
    override fun close() = println("xiaomi close")
}

class HuaWei: Phone {
    override fun open() = println("huawei open")
    override fun call() = println("huawei call")
    override fun close() = println("huawei close")
}

c)抽象类,这里就聚合了手机的具体行为.

abstract class Model (
    protected val phone: Phone //聚合手机
)

d)精确抽象,就是手机的不同参数类型实体,通过调用父类聚合的手机行为完成动作.

class PhonePro (
    phone: Phone
): Model(phone) {
    fun open() {
        super.phone.open()
        println("pro")
    }
    fun close() {
        super.phone.close()
        println("pro")
    }
    fun call() {
        super.phone.call()
        println("pro")
    }
}

class PhoneMini (
    phone: Phone
): Model(phone) {
    fun open() {
        super.phone.open()
        println("mini")
    }
    fun close() {
        super.phone.close()
        println("mini")
    }
    fun call() {
        super.phone.call()
        println("mini")
    }
}

e)客户端

fun main() {
    val huaWeiPro = PhonePro(HuaWei())
    huaWeiPro.call()
    println("-------------------------------")
    val xiaoMiPro = PhonePro(XiaoMi())
    xiaoMiPro.call()
}

运行如下:

 

桥接模式的扩展性

根据上述代码,将来如果要新增一种手机类型,例如 IPhone,那么只需要添加这样一个具体的行为实现类即可.

a)只需要一个 IPhone 的实现类即可,无需再给 IPhone 添加pro、mini、promax参数,因为行为和抽象已经是分离的.

class IPhone: Phone {
    override fun open() = println("iphone open")
    override fun call() = println("iphone call")
    override fun close() = println("iphone close")
}

b)客户端直接调用即可

fun main() {
    val huaWeiPro = PhonePro(HuaWei())
    huaWeiPro.call()
    println("-------------------------------")
    val xiaoMiPro = PhonePro(XiaoMi())
    xiaoMiPro.call()
    println("-------------------------------")
    val iphonePro = PhonePro(IPhone())
    iphonePro.call()
}

c)运行结果

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

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

相关文章

项目如何整合sentinel

1、添加依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifact…

嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间

目录 1 进程时间概念 2 times 函数 2.1 times 函数介绍 2.2 示例程序 3 clock 函数 3.1 clock 函数介绍 3.2 示例程序 1 进程时间概念 进程时间指的是进程从创建后&#xff08;也就是程序运行后&#xff09;到目前为止这段时间内使用 CPU 资源的时间总数&#xff0c;出…

音视频入门基础:H.264专题(7)——FFmpeg源码中 指数哥伦布编码的解码实现

音视频入门基础&#xff1a;H.264专题系列文章&#xff1a; 音视频入门基础&#xff1a;H.264专题&#xff08;1&#xff09;——H.264官方文档下载 音视频入门基础&#xff1a;H.264专题&#xff08;2&#xff09;——使用FFmpeg命令生成H.264裸流文件 音视频入门基础&…

【Apache Doris】周FAQ集锦:第 9 期

【Apache Doris】周FAQ集锦&#xff1a;第 9 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目&#xff01; 在这个栏目中&#xff0c;每周将筛选社区反馈的热门问题和话题&#xff0c;重点回答并进行深入探讨。旨在为广大用户和…

2024 InForSec@BCS网络空间安全国际学术研究交流会,同探网安技术创新与应用前沿

6月6日&#xff0c;2024年InForSecBCS网络空间安全国际学术研究交流会在北京国家会议中心成功举办&#xff0c;线上线下近千人参加了本次研讨会。 本次学术研究交流会主题为“网络安全技术创新与应用前沿”&#xff0c;邀请了国内从事人工智能安全、互联网基础设施安全、电磁安…

APP逆向 day7 JAVA基础2

一.前言 昨天我们讲了点java基础&#xff0c;大家是不是觉得就特别简单&#xff0c;今天讲点稍微难一丢丢的基础&#xff0c;也就是java基础2.0&#xff0c;今天我要和大家说的内容十分的重要&#xff0c;直接关乎到下一节的内容&#xff0c;所以&#xff0c;好好学&#xff0…

Python基础小知识问答系列-随机数相关

1. 问题&#xff1a; 如何生成x-y之间的随机整数&#xff1f; 如何生成0-1之间的随机浮点数&#xff1f; 如何生成x-y之间的随机浮点数&#xff1f; 如何从列表中随机获取一个元素&#xff1f; 如何从列表中随机获取多个元素&#xff1f; 如…

VQVAE:Neural Discrete Representation Learning

论文名称&#xff1a;Neural Discrete Representation Learning 开源地址 发表时间&#xff1a;NIPS2017 作者及组织&#xff1a;Aaron van den Oord,Oriol Vinyals和Koray Kavukcuoglu, 来自DeepMind。 1、VAE 简单回顾下VAE的损失函数&#xff0c;ELBO的下界为&#xff1a; …

qt for android 使用打包sqlite数据库文件方法

1.在使用sqlite数据库时&#xff0c;先将数据库文件打包&#xff0c;放置在assets中如下图: 将文件放置下android中的assets下的所有文件都会打包在APK中&#xff0c;可以用7zip查看apk文件 2.在qt代码读取数据文件&#xff0c;注意在assets下的文件都是Read-Only&#xff0c;需…

初阶数据结构之堆讲解

本篇文章带大家学习的是堆&#xff0c;还请各位观众老爷给个三连 正片开始 堆的概念 如果有一个关键码的集合 K { &#xff0c; &#xff0c; &#xff0c; … &#xff0c; } &#xff0c;把它的所有元素按完全二叉树的顺序存储方式存储 在一个一维数组中&#xff0c;并满…

HarmonyOS开发实战:加密类组件使用方法-API

加密类组件 模块介绍RSA提RSA供生成密钥加解密验签等系列方法(基于HarmonyOS API)AES提供AES生成密钥加解密等系列方法(基于HarmonyOS API)DES提供3DES生成密钥加解密等系列方法(基于HarmonyOS API)SM2提供SM2生成密钥加解密等系列方法(基于HarmonyOS API)SM3提供SM3生成摘要,…

vue 自定义组件 实现跟使用

新建文件组件 选择器作用 ~ 波浪线这个是选择 li 后面的所有 a标签 调用 到使用的文件下引入 使用 效果

类似李跳跳的软件有什么,强烈推荐所有安卓手机安装!!!

今天阿星分享一款让安卓手机更顺滑的神器——智慧岛。你问我李跳跳&#xff1f;由于大家都知道的原因&#xff0c;那是个曾经让广告无处遁形的神兵利器&#xff0c;可惜现在它已经退休了。不过别担心&#xff0c;智慧岛接过了接力棒&#xff0c;继续为我们的安卓体验保驾护航。…

爱情再启:庄国栋笑谈“玫瑰人生”爱情觉悟

庄国栋&#xff0c;这位电视剧《玫瑰的故事》中的男主角&#xff0c; 最近在一次采访中坦言&#xff1a;“如果给我一次重来的机会&#xff0c; 我绝对会毫不犹豫地选择爱情&#xff01;” 听到这话&#xff0c; 我不禁想&#xff0c;庄先生&#xff0c;您是不是被剧里的玫瑰…

42.HOOK引擎核心代码

上一个内容&#xff1a;41.HOOK引擎设计原理 以 40.设计HOOK引擎的好处 它的代码为基础进行修改 主要做的是读写寄存器 效果图 添加一个类 htdHook.h文件中的实现 #pragma once class htdHook { public:htdHook(); };htdHook.cpp文件中的实现&#xff1a; #include "…

Java并发编程基础知识点

目录 Java并发编程基础知识点1、线程&#xff0c;进程概念及二者的关系进程相关概念线程相关概念进程与线程的关系补充小知识点&#xff1a; 2、线程的状态Java线程的状态&#xff1a;Java线程不同状态之间的切换图示 3、Java程序中如何创建线程&#xff1f;①、继承Thread类②…

深入解析Java和Go语言中String与byte数组的转换原理

1.Java String与byte[]互相转换存在的问题 java中&#xff0c;按照byte[] 》string 》byte[]的流程转换后&#xff0c;byte数据与最初的byte不一致。 多说无益&#xff0c;上代码&#xff0c;本地macos机器执行&#xff0c;统一使用的UTF-8编码。 import java.nio.charset.S…

办理河南公司企业信用等级3A证书流程和条件

企业信用等级3A证书属于一种荣誉资质&#xff0c;是提升企业公信力和影响力保障的一项资质。信用等级是信用 (资信)评估机构根据企业资信评估结果对企业信用度划分的等级类别&#xff0c;它反映了企业信用度的高低。AAA信用等级是一种等级划分。代指企业的信用经过行业、机构评…

【Chapter4】汇编语言及其程序设计,《微机系统》第一版,赵宏伟

一、汇编语言概述 **指令&#xff1a;**指使计算机完成某种操作的命令。 **程序&#xff1a;**完成某种功能的指令序列。 **软件&#xff1a;**各种程序总称。 **机器语言&#xff1a;**计算机能直接识别的语言。用机器语言写出的程序称为机器代码。 **汇编语言&#xff1…

【Python】已解决ModuleNotFoundError: No module named ‘tensorflow‘

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决ModuleNotFoundError: No module named ‘tensorflow‘ 一、分析问题背景 ModuleNotFoundError: No module named ‘tensorflow’ 是一个常见的错误&#xff0c;通常在Pytho…