Android设计模式—桥接模式

news2025/1/12 15:59:32

1.桥接模式

桥接模式是一种结构型设计模式,它通过将抽象部分与实现部分分离来解耦。它使用接口作为桥梁,将一个抽象类与其实现类的代码独立开来,从而使它们可以各自独立地变化。桥接模式的核心思想是“组合优于继承”。

简单来讲,就是一个类的功能有两个维度来控制,两个维度都有不同的实现,可以进行随意的组合。

为了达到让抽象部分和实现部分独立变化的目的,抽象部分会拥有实现部分的接口对象,有了实现部分的接口对象之后,就能够通过这个接口来调用具体实现部分的功能。桥接在程序上就体现成了抽象部分拥有实现部分的接口对象,实现了一种桥接关系。桥接模式中的桥接是一个单方向的关系,只能够抽象部分去使用实现部分的对象。

2b71f933ef3a4e97b1d338dbba72613d.png

抽象化角色Abstraction:抽象化给出的定义,其中保存了一个对实现化对象的引用。

修正抽象化角色Refined Abstraction:扩展抽象化角色,改变和修正父类对抽象化的定义。

实现化角色Implementor:给出实现化角色的接口,但不给出具体的实现。注意,这个接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。

具体实现化角色ConcreteImplementor:给出实现化角色接口的具体实现。

抽象部分:

public abstract class Abstraction {

    private Implementor implementor; //在抽象部分会拥有实现部分的接口对象,接口作为桥梁,使得抽象实现类的功能独立于接口实现类

    public Abstraction(Implementor implementor

        this.implementor = implementor;

    }

    public void operation() {

        implementor.operationImpl();

    }

}

public class RefinedAbstraction extends Abstraction {

    public RefinedAbstraction(Implementor implementor) {

        super(implementor);

    }

    public void refinedOperation() {

        //对 Abstraction 中的 operation 方法进行扩展

    }

}

实现部分:

public interface Implementor {

    void operationImpl();

}

public class ConcreteImplementorA implements Implementor{

    @Override

    public void operationImpl() {

        //具体实现

    }

}

public class ConcreteImplementorB implements Implementor{

    @Override

    public void operationImpl() {

        //具体实现

    }

}

通过结构可以清楚地看到抽象类Abstraction就像一个桥梁一样将RefinedAbstraction和Implementor连接起来。

 

2.桥接模式的使用场景

①如果一个系统需要在构建的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。

②抽象化角色和实现化角色可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。

③一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。

④虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。

⑤对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。

 

3.桥接模式的优缺点

1)优点:

①抽象部分和实现部分分离

桥接模式分离了抽象部分和实现部分,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来,分别定义接口,这有助于系统进行分层设计,从而产生更好的结构化系统。对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了。

②更好的可扩展性

桥接模式分别定义抽象部分和实现部分的接口,这就使得抽象部分和实现部分可以分别独立扩展,而不会相互影响,大大提高了系统的可扩展性。

③可动态的切换实现

由于桥接模式实现了抽象和实现的分离,所以在实现桥接模式时,就可以实现动态的选择和使用具体的实现。

④实现细节对客户端透明,可以对用户隐藏实现细节。

2)缺点:

①桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程。

②桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性。

 

4.桥接模式示例

为了更好地理解桥接模式,来看一个简单的示例:假设有一个形状类,其中有一个颜色属性。此时,如果使用继承来实现不同颜色的形状类,就需要创建许多子类,使代码结构变得复杂且难以维护。而使用桥接模式,则可以将形状和颜色分别抽象出来,从而将它们独立开来。

public interface Color {

    String getColor();

public class Red implements Color {

    @Override

    public String getColor() {

        return "红色";

    }

}

public class Blue implements Color {

    @Override

    public String getColor() {

        return "蓝色";

    }

}

public abstract class Shape {

    protected Color color;

    public Shape(Color color) {

        this.color = color;

    }

    public abstract void draw();

}

public class Rectangle extends Shape {

    public Rectangle(Color color) {

        super(color);

    }

    @Override

    public void draw() {

        System.out.println("绘制一个" + color.getColor() + "的矩形");

    }

}

public class Circle extends Shape {

    public Circle(Color color) {

        super(color);

    }

    @Override

    public void draw() {

        System.out.println("绘制一个" + color.getColor() + "的圆形");

    }

}

在上面的代码中,首先定义了一个颜色接口,并分别实现了红色和蓝色。然后,定义了一个抽象的形状类,其中有一个颜色属性和一个抽象方法draw()。最后,实现了具体的矩形和圆形类,并在构造函数中传入了一个颜色对象。

这样,就将形状和颜色分别抽象出来,从而实现了解耦。当需要创建不同颜色的形状时,只需要创建不同颜色的对象并传入即可。

 

5.Android源码中的使用

Window与WindowManager之间使用的就是桥接模式。

e58182d822ae4e9480fac4fe202cd57b.png

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

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

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

相关文章

RecyclerView性能优化之异步预加载

RecyclerView性能优化之异步预加载 前言 首先需要强调的是,这篇文章是对我之前写的《浅谈RecyclerView的性能优化》文章的补充,建议大家先读完这篇文章后再来看这篇文章,味道更佳。 当时由于篇幅的原因,并没有深入展开讲解&…

【TCP/IP】广播 - 定义、原理及编程实现

目录 广播 广播的原理及形式 广播的编程与实现 套接字选项设置 发送者 接收者 拓展资料 广播 广播(Broadcast)是指封包在计算机网络中传输时,目的地址为网络中所有设备的一种传输方式。这里所说的“所有设备”也被限定在一个范围之中,这个范围被称…

Android 13(T) - binder阅读(4)- 使用ServiceManager注册服务2

上一篇笔记我们看到了binder_transaction,这个方法很长,这一篇我们将把这个方法拆分开来看binder_transaction做了什么,从而学习binder是如何跨进程通信的。 1 binder_transaction static void binder_transaction(struct binder_proc *proc…

Java 面试知识点合集

一、基础篇 1.1 java基础 1.面向对象的特征:封装、继承、多态 (1).封装:属性能够描述事物的特征,方法能够描述事物的动作。封装就是把同一类事物的共性(包括属性和方法)归到同一类中,方便使用。 封装的…

音视频处理工具FFmpeg与Java结合的简单使用

一、什么是FFmpeg FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解…

chatgpt赋能python:Python编写n!——让阶乘计算变得更简单

Python编写n!——让阶乘计算变得更简单 阶乘是高中数学中常见的运算,它的含义是从1到n的所有正整数相乘,用叹号表示为n!。例如,5! 1 2 3 4 5 120。在计算机编程中,我们常常需要计算阶乘。而Python作为一门便捷易用的编程语…

chatgpt赋能python:Python编程自动化办公–提升工作效率的利器

Python编程自动化办公 – 提升工作效率的利器 越来越多企业对协作和业务流程的优化提高了要求,自动化办公就是其中之一,而Python编程能够帮助我们实现高效自动化办公。Python是一种多用途,高效的编程语言,被广泛应用于应用程序开…

UE4/5动画系列(3.通过后期处理动画蓝图的头部朝向Actor,两种方法:1.通过动画层接口的look at方法。2.通过control rig的方法)

目录 蓝图 点积dot Yaw判断 后期处理动画蓝图 动画层接口 ControlRig: 蓝图 首先我们创建一个actor类,这个actor类是我们要看的东西,actor在哪,我们的动物就要看到哪里(同样,这个我们也是做一个父类&#xff0…

chatgpt赋能python:Python程序员的秘密武器:给不及格成绩加分

Python程序员的秘密武器:给不及格成绩加分 Python是一个语法简洁、易学易用的编程语言,已经成为了很多程序员的首选语言。在学校中,很多学生选择学习Python作为他们的编程课程。然而,有时候即便是刻苦学习,踏实地完成…

3D定制化开发工具HOOPS如何满足EDA设计需求?(上)

HOOPS SDK 是由 Tech Soft 3D 公司开发和提供的一款软件开发工具包。HOOPS SDK 为开发者提供了强大的3D图形渲染和交互功能,用于构建高性能的工程、设计和制造应用程序。其主要功能包括:3D 图形渲染、交互性、数据管理、算法和分析、可定制性等。 HOOPS…

chatgpt赋能python:Python编写一个可以颠倒数组元素的函数

Python编写一个可以颠倒数组元素的函数 在Python编程中,我们经常需要对列表(即数组)进行操作。其中一个常见的操作就是颠倒列表中各元素的排列顺序。这个操作在很多场景下都有用,例如逆序输出字符串、逆序遍历二叉树等等。在本篇…

Atlas 200I DK A2开发者套件通过路由器联网(360安全路由-V2)

一、参考资料 Windows系统 通过直连路由器连接外部网络 二、准备工作 准备micro SD存储卡,即TF卡,建议128GB以上;准备micro SD读卡器;准备普通网线一根;准备一个路由器, 360安全路由-V2路由器。 三、关键…

机器人开发--SLAM详细介绍

机器人开发--SLAM介绍 1 介绍1.1 概述1.2 发展历程三个时代重要时间节点视觉SLAM分类及里程碑技术发展 1.3 SLAM与各模块关系1.5 SLAM分类1.4 应用领域 2 SLAM框架视觉/惯性SLAM系统框架结构经典框架 3 常见方案3.1 常见激光雷达方案3.2 常见视觉方案3.3 多传感器融合方案 4 地…

chatgpt赋能python:Python中同一变量多次赋值的探讨

Python中同一变量多次赋值的探讨 介绍 Python是一种非常流行的编程语言,具有易于学习和使用、强大的功能和可扩展性、广泛的应用领域等众多优点。在Python中,我们可以对同一变量多次进行赋值,这在某些情况下非常有用。本文将探讨在Python中…

2.3、Bean的管理

一、Bean的装配(IOC应用实现) 创建应用组件之间的协作的行为通常称为装配(wiring)。Spring IOC通过应用上下文(ApplicationContext)装载Bean的定义并把他们组装起来。 Spring应用上下文(Applica…

yum安装LNMP

目录 前言 一、yum安装要用在线yum源 二、安装Nginx 1、搭建Nginx环境 2、安装yum 3、查看Nginx是否安装成功 4、设置开机自启 三、安装MySQL 1、除系统中所有以"mariadb"开头的软件包 2、安装MySQL 3、设置开机自启 4、查看MySQL初始密码 5、修改MySQL密码…

第 107 场LeetCode双周赛

A 最大字符串配对数目 显然各字符串对 间匹配的先后顺序不影响最大匹配数目, 可以从后往前遍历数组, 判断前面是否有和当前末尾构成匹配的. class Solution { public:int maximumNumberOfStringPairs(vector<string> &words) {int res 0; while (words.size…

Python基础五

目录 一、Ptyhon数据类型--元组 1.元组的注意事项 2.元组的下标 3.访问元组元素 4.拼接元组 5.删除元组 6.元组运算符 二、Python内置函数--元组相关 一、Ptyhon数据类型--元组 Python 的元组与列表类似&#xff0c;不同之处在于元组的元素不能修改&#xff0c;也不能…

chatgpt赋能python:Python编写预警系统——保障企业安全的得力工具

Python编写预警系统——保障企业安全的得力工具 随着互联网应用的发展&#xff0c;企业所要面对的风险和威胁也与日俱增&#xff0c;预警系统的作用在保障企业安全中越来越显著。Python编写预警系统&#xff0c;成为了许多企业和团队的首选&#xff0c;具有方便快捷、灵活多样…

【软考网络管理员】2023年软考网管初级常见知识考点(13)-ARP、ICMP、IPv6协议详解

#涉及知识点 ARP协议详解、ICMP协议详解、IPv6协议等软考内容详解 软考网络管理员常考知识点&#xff0c;软考网络管理员网络安全&#xff0c;网络管理员考点汇总。 原创于&#xff1a;CSDN博主-《拄杖盲学轻声码》&#xff0c;更多考点汇总可以去他主页查看 文章目录 前言一、…