Android设计模式详解之桥接模式

news2025/1/17 8:46:45

前言

桥接模式也称为桥梁模式,是结构型设计模式之一;

定义:将抽象部分与实现部分分离,使它们都可以独立地进行变化;

使用场景:

  • 如果一个系统需要在构建的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,可以通过桥接模式使它们在抽象层建立一个关联关系;
  • 对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,也可以考虑使用桥接模式;
  • 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展;

UML类图:
桥接模式UML
Abstraction:抽象部分,该类保持一个对实现部分对象的引用,抽象部分中的方法需要调用实现部分的对象来实现,该类一般为抽象类;

RefinedAbstraction:优化的抽象部分,抽象部分的具体实现,该类一般是对抽象部分的方法进行完善和扩展;

Implementor:实现部分,可以为接口或抽象类,其方法不一定要与抽象部分中的一致,一般情况下是由实现部分提供基本的操作,而抽象部分定义的则是基于实现部分这些基本操作的业务方法;

ConcreteImplementorA、ConcreteImplemetorB:实现部分的具体实现,完善实现部分中方法定义的具体逻辑;

Client:客户类,客户端程序;

示例代码

这里以喝咖啡进行举例,咖啡可以简单分为4类,大杯加糖、大杯不加糖、小杯加糖、小杯不加糖,实际上对应两种变化,一个是大杯小杯,一个是加糖与不加糖,下面我们使用桥接模式来实现:

  • 定义咖啡添加类,相当于Implementor角色,CoffeeAdd
/**
 * 咖啡添加类,相当于Implementor角色
 */
interface CoffeeAdd {

    /**
     * 具体添加什么由子类实现
     */
    fun add(): String
}
  • 定义加糖类,相当于ConcreteImplement角色,Sugar
/**
 * 加糖,相当于ConcreteImplement角色
 */
class Sugar : CoffeeAdd {
    override fun add(): String {
        return "加糖"
    }
}
  • 定义原味类,相当于ConcreteImplement角色,Ordinary
/**
 * 原味,相当于ConcreteImplement角色
 */
class Ordinary : CoffeeAdd {
    override fun add(): String {
        return "不加糖"
    }
}
  • 定义咖啡类,相当于Abstraction角色,Coffee
/**
 * 咖啡类,相当于Abstraction角色
 */
abstract class Coffee(private val coffeeAdd: CoffeeAdd) {
    /**
     * 制作咖啡,具体什么样的咖啡由子类决定
     */
    abstract fun makeCoffee()
}
  • 定义大杯咖啡类,相当于RefinedAbstraction角色
/**
 * 生产大杯咖啡,相当于RefinedAbstraction角色
 */
class LargeCoffee(private val coffeeAdd: CoffeeAdd) : Coffee(coffeeAdd) {
    override fun makeCoffee() {
        println("大杯${coffeeAdd.add()}咖啡")
    }
}
  • 定义小杯咖啡类,相当于RefinedAbstraction角色
class SmallCoffee(private val coffeeAdd: CoffeeAdd) : Coffee(coffeeAdd) {
    override fun makeCoffee() {
        println("小杯${coffeeAdd.add()}咖啡")
    }
}
  • 编写测试类进行验证
object Test {

    @JvmStatic
    fun main(args: Array<String>) {
        /**
         * 构造加糖不加糖
         */
        val sugar = Sugar()
        val ordinary = Ordinary()

        /**
         * 生产大杯加糖咖啡
         */
        val largeCoffee = LargeCoffee(sugar)
        largeCoffee.makeCoffee()

        /**
         * 生产小杯不加糖咖啡
         */
        val smallCoffee = SmallCoffee(ordinary)
        smallCoffee.makeCoffee()
    }
}

结果输出:

大杯加糖咖啡
小杯不加糖咖啡

Android源码中的桥接模式

  • Window与WindowManager
    Window关系图
    其中WindowPhoneWindow构成窗口的抽象部分,Window为抽象部分的接口,PhoneWindow为抽象部分的具体实现以及扩展,而WindowManager则为实现部分的基类,WindowManagerImpl为实现部分具体的逻辑实现,它使用WindowMangerGlobal通过IWindowManager接口与WMS进行通信,最终由WMS完成具体窗口的管理工作;典型的桥接涉及模式!

总结

优点:
分离抽象与实现、灵活的扩展以及对客户来说透明的实现;

缺点:
不容易设计,对开发者来说要把握住抽象与实现的分离;

结语

如果以上文章对您有一点点帮助,希望您不要吝啬的点个赞加个关注,您每一次小小的举动都是我坚持写作的不懈动力!ღ( ´・ᴗ・` )

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

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

相关文章

laravel5.5.50之权限(laravel-permissions)的使用

目录 一、安装laravel-permissions扩展 二、生成数据库迁移文件 三、执行数据迁移 四、php artisan migrate 生成的表 五、生成配置信息 六、在user模型下加载角色相关信息 七、测试角色、权限 一、安装laravel-permissions扩展 #不指定安装版本的命令 composer requir…

提升舆情监测软件技术方法解读,舆情监测技术逻辑?

舆情监测是指通过技术手段&#xff0c;对网络舆情进行监测、分析、挖掘和可视化展示的工作。舆情监测可以帮助企业、政府、组织等了解社会舆论&#xff0c;掌握社会动态&#xff0c;协助决策&#xff0c;提升社会影响力。TOOM舆情监测系统介绍提升舆情监测软件技术方法解读&…

Zabbix与乐维监控对比分析(七)——网络功能篇

前面我们详细介绍了Zabbix与乐维监控在架构与性能、Agent管理、自动发现、权限管理、对象管理、告警管理、可视化及图形图表方面的对比分析&#xff0c;接下来我们将对二者网络功能方面进行对比分析。 本篇是Zabbix与乐维监控对比专题系列文章的第七篇——网络功能篇&#xff…

gitlab+jenkins+docker持续集成环境搭建实战

介绍 什么是持续集成&#xff1f; 持续集成&#xff08;CI&#xff09;是在源代码变更后自动检测、拉取、构建和&#xff08;在大多数情况下&#xff09;进行单元测试的过程。持续集成是启动管道的环节&#xff08;尽管某些预验证 —— 通常称为 上线前检查(pre-flight checks)…

2023 数据结构复习

函数编程题 7-1 交换二叉树中每个结点的左孩子和右孩子 #include<stdio.h> #include<stdlib.h> typedef struct Node {char data;struct Node *left, *right; } Node, *Tree;Tree create() {char ch;Tree tree NULL;if (scanf("%c", &ch)) {//当有…

P5015 [NOIP2018 普及组] 标题统计————C++

题目 [NOIP2018 普及组] 标题统计 题目描述 凯凯刚写了一篇美妙的作文&#xff0c;请问这篇作文的标题中有多少个字符&#xff1f; 注意&#xff1a;标题中可能包含大、小写英文字母、数字字符、空格和换行符。统计标题字 符数时&#xff0c;空格和换行符不计算在内。 输入…

JAVA开发与架构(携程架构实践)

发这篇博文主要是想学习一下携程的架构。携程出了一本《携程架构实践》&#xff0c;无奈现在还没开源。看京东价大概109元人民币。如果看到次博文的网友能发我一本《携程架构实践》pdf。不胜感谢。或者实体书籍也行。其实我不怎么需要实体书籍&#xff0c;因为技术的东西很快会…

特种变色树脂T-46 CC

Tulsimer T-46 CC ISO-9001/ISO-14001/OHSAS-18000 特级强酸性阳离子交换树脂--(自变色树脂) Tulsimer T-46 CC 是一款专门研制的、优质的、强酸型的聚苯乙烯架构的阳离子交 换树脂&#xff0c;具有核子级磺酸官能团&#xff0c; 并同时拥有绝佳的物理及化学稳定品质&#x…

three.js 之 入门篇1

目录three.js 之 入门篇1&#xff1a;使用parcel搭建 three.js 开发环境2&#xff1a;运行一个简单的场景和物体2.1 main.js2.2效果3&#xff1a;轨道控制器和控制物体 mesh3.1 main.js3.2效果4&#xff1a;添加坐标辅助器 AxesHelper4.14.2效果5&#xff1a;设置几何体移动5.1…

深度学习 Day24——使用Pytorch环境实现mnist手写数字识别

深度学习 Day24——使用Pytorch环境实现mnist手写数字识别 文章目录深度学习 Day24——使用Pytorch环境实现mnist手写数字识别一、前言二、我的环境三、Pytorch简介四、前期工作1、导入依赖项和设置GPU2、导入数据3、加载数据4、数据可视化五、构建简单的CNN网络六、训练模型1、…

Spring的嵌套事务(Propagation.NESTED)到底是个啥

什么是嵌套事务 嵌套事务其实是对数据库SavePoint概念的Java操作版封装&#xff0c;什么是SavePoint参考我另一篇blog&#xff1a;juejin.cn/post/718544… SavePoint是数据库事务中的一个概念, 可以将整个事务切割为不同的小事务, 可以选择将状态回滚到某个小事务发生时的样…

Java图形化界面---AWT布局管理器

目录 一、布局管理器介绍 二、布局管理器用法 &#xff08;1&#xff09;FlowLayout &#xff08;2&#xff09;BorderLayout &#xff08;3&#xff09;GridLayout &#xff08;4&#xff09;CardLayout &#xff08;5&#xff09;BoxLayout 三、Box容器的讲解 一、布…

自主实现HTTP

"让我们&#xff0c;跳吧在无比宏达的星系!" 一、背景 超文本传输协议&#xff08;Hyper Text Transfer Protocol&#xff0c;HTTP&#xff09;是一个简单的请求-响应协议&#xff0c;它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么…

STL list容器底层代码剖析、正向迭代器与反向迭代器的类的封装

目录 一、迭代器是什么 二、迭代器的本质 三、如何给一个容器实现迭代器功能 四、正向迭代器功能的具体实现 五、反向迭代器 六、list底层代码剖析 一、迭代器是什么 迭代器&#xff08;iterator&#xff09;有时又称光标&#xff08;cursor&#xff09;是程序设计的软件设…

【手写 Vue2.x 源码】第六篇 - 数据代理的实现

一&#xff0c;前言 上篇&#xff0c;主要介绍了 Vue 数据初始化流程中&#xff0c;数组类型的数据劫持是如何实现的&#xff0c;核心思路如下&#xff1a; 出于对性能的考虑&#xff0c;Vue 没有对数组采用 Object.defineProperty 进行递归劫持&#xff0c;而是对能够导致原…

NOSQL数据库习题

NOSQL数据库习题第一章第二章第三章第四章第五章NoSQL数据库上机测试第一章 1.写出DB、RDB、DBMS、TRDB、NoSQL、NewSQL、NDFS的中文名称。 答&#xff1a;DB&#xff1a;数据库 RDB&#xff1a;关系型数据库 DBMS&#xff1a;数据库管理系统 TRDB&#xff1a;传统关系型数据…

解决Shotgrid登陆不上, 上传出错,窗口卡住不动等问题

在使用Shotgrid时&#xff0c;是否遇到这种问题&#xff1a; accounts.autodesk.com出错 auth.autodesk.com出错 再或者这样出错&#xff1a; Shotgrid登陆出错 再再这样关闭Load…时这样出错&#xff0c; 窗口半天都关闭不了&#xff1a; 分析&#xff1a; 1 出现这种错…

(一分钟)激光SLAM扫描匹配 文献阅读

本博客介绍了激光SLAM扫描匹配的相关问题。编辑切换为居中添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09;扫描匹配也是数据关联类的问题&#xff0c;是SLAM里面的重要构成部分。编辑切换为居中添加图片注释&#xff0c;不超过 140 字&#xff08;可选&…

PyTorch实例2——文本情绪分类器

实例主要用于熟悉相关模型&#xff0c;并且练习创建一个模型的步骤&#xff1a;数据收集、数据预处理、构建模型、训练模型、测试模型、观察模型表现、保存模型传送门&#xff1a;蓝桥云课实验 目录1. 实验环境2. 实验目的3. 相关原理4. 实验步骤4.1 数据收集从在线商城抓取评论…

OpenHarmony 标准系统HDF框架之I2C驱动开发

OpenHarmony 标准系统HDF框架之I2C驱动开发主要内容I2C 基础知识## I2C 基础知识 —— 概念和特性I2C 基础知识 —— 协议、四种信号组合I2C 调试手段## I2C 调试手段 —— 硬件I2C 调试手段 —— 软件HDF 框架下的 I2C 设备驱动## HDF 框架下的 I2C 设备驱动 —— 案例描述HDF…