Android设计模式--桥接模式

news2024/11/27 11:34:37

闻正言,行正道,左右前后皆正人

一,定义

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

二,使用场景

从模式的定义中,我们大致可以了解到,这里的桥接的作用其实就是连接抽象部分与实现部分,但事实上,任何多维度变化类或者说多个树状类之间的耦合都可以使用桥接模式来实现解耦。

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

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

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

三,角色介绍

1,Abstraction 抽象部分

该类保持一个对实现部分对象的引用,抽象部分中的方法需要调用实现部分的对象来实现,该类一般为抽象类。

2,RefinedAbstraction 优化的抽象部分

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

3,Implementor 实现部分

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

4,ConcreteImplementor 实现部分的具体实现

完善 实现部分中方法定义的具体逻辑

5,Client 客户端调用

四,使用案例

假如我们的笔记本工厂有联想i5,联想i7,联想i9,华硕i5,华硕i7,华硕i9这些类型的电脑生产。那么对于笔记本电脑来说,实质上就两种变化,联想和华硕、i5,i7,i9

那么我们就将品牌定义为抽象部分,cpu型号定义为实现部分。因为它们是两个维度的变化,当然也可以反过来定义。

首先定义实现部分,生产不同的CPU

public interface CPU {

    void makeCPU();
}

然后具体实现不同的CPU型号:

public class I5cPU implements CPU{
    @Override
    public void makeCPU() {
        System.out.println("生产i5Cpu");
    }
}
public class I7Cpu implements CPU{
    @Override
    public void makeCPU() {
        System.out.println("生产i7Cpu");
    }
}
public class I9Cpu implements CPU{
    @Override
    public void makeCPU() {
        System.out.println("生产i9Cpu");
    }
}

 然后定义抽象部分,持有实现部分CPU的引用 ,生产不同品牌的电脑:

/**
 * 抽象部分  笔记本电脑
 * */
public abstract class NoteBook {
    protected CPU cpu;

    public NoteBook(CPU cpu) {
        this.cpu = cpu;
    }

    /**
     *
     * */
    public abstract void makeComputer();

}

然后是RefinedAbstraction 优化的抽象部分,实现不同品牌的电脑:

public class LenovoNoteBook extends NoteBook{

    public LenovoNoteBook(CPU cpu) {
        super(cpu);
    }

    @Override
    public void makeComputer() {

        System.out.println("生产联想电脑");
        cpu.makeCPU();
    }
}
public class AsusNoteBook extends NoteBook{

    public AsusNoteBook(CPU cpu) {
        super(cpu);
    }

    @Override
    public void makeComputer() {
        System.out.println("生产华硕笔记本电脑");
        cpu.makeCPU();
    }
}

最后是在client使用:

I5cPU i5cPU =new I5cPU();
I7Cpu i7Cpu =new I7Cpu();
I9Cpu i9Cpu =new I9Cpu();
//联想i5
LenovoNoteBook lenovoNoteBook1 =new LenovoNoteBook(i5cPU);
lenovoNoteBook1.makeComputer();
//联想i7
LenovoNoteBook lenovoNoteBook2 =new LenovoNoteBook(i7Cpu);
lenovoNoteBook2.makeComputer();
//联想i9
LenovoNoteBook lenovoNoteBook3 =new LenovoNoteBook(i9Cpu);
lenovoNoteBook3.makeComputer();
//华硕i5
AsusNoteBook asusNoteBook1 =new AsusNoteBook(i5cPU);
asusNoteBook1.makeComputer();
//华硕i7
AsusNoteBook asusNoteBook2 =new AsusNoteBook(i7Cpu);
asusNoteBook2.makeComputer();
//华硕i9
AsusNoteBook asusNoteBook3 =new AsusNoteBook(i9Cpu);
asusNoteBook3.makeComputer();

输出结果:

 

如果 我们想再增加 一个惠普品牌的笔记本电脑,那么只需要新建一个类 实现抽象部分即可:

 

public class HPNoteBook extends NoteBook{

    public HPNoteBook(CPU cpu) {
        super(cpu);
    }

    @Override
    public void makeComputer() {
        System.out.println("生产惠普笔记本电脑");
    }
}

在客户端使用:

 

//惠普i5
HPNoteBook hpNoteBook1 =new HPNoteBook(i5cPU);
hpNoteBook1.makeComputer();
//惠普i7
HPNoteBook hpNoteBook2 =new HPNoteBook(i7Cpu);
hpNoteBook2.makeComputer();
//惠普i9
HPNoteBook hpNoteBook3 =new HPNoteBook(i9Cpu);
hpNoteBook3.makeComputer();

同样的如果 我们要增加实现部分CPU型号,比如要增加i3,也是直接新建 类就可以。

五,总结

桥接模式可以应用到许多开发中,但是它应用的却不多,一个很重要的原因是对于抽象与实现的分离把握,是不是需要分离,如何分离?对设计者来说要有一个恰倒好处的分寸。不管怎么说,桥接模式的优点我们毋庸置疑,分离抽线与实现,灵活的扩展以及对客户来说透明的实现等。但是使用桥接模式也有一个不明显的缺点,上面我们也提到了,就是不容易设计,对开发者来说要有一定的经验要求,因此,对桥接模式应用来说,理解很简单,设计却不容易。

参考文献:Android源码设计模式解析与实战

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

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

相关文章

如何提高API性能

下图给出了提高API性能的5个常用技巧 分页 当结果很大时,这是一种常见的优化。结果会流回客户端以提高服务响应能力。 异步日志记录 同步日志记录每次调用都会处理磁盘,并且会降低系统速度。异步日志记录首先将日志发送到无锁缓冲区并立即返回。日志将…

肾合胶囊 | 冬不养肾春易病,若出现了这六大表现,小心是肾虚!

冬季作为一年中最寒冷的季节,自然万物皆静谧闭藏,而肾具有潜藏、封藏、闭藏精气的特点,是封藏之本,肾的脏腑特性与冬季相通应,所以在冬季更应该重视养肾。 而现在正值初冬,正是开始养肾的最佳时间。此时培…

2018年3月26日 Go生态洞察:Go包版本管理提案分析

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

Java核心知识点整理大全16-笔记

Java核心知识点整理大全-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全2-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全3-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全4-笔记-CSDN博客 Java核心知识点整理大全5-笔记-CSDN博客 Java核心知识点整理大全6…

4/5G互操作 EPSFB讲解

今天我们来讲一下4/5G之间之间互操作,以及5G的EPSFB是基于什么实现的~ 目录 4/5G互操作 重选 切换 基于覆盖的切换 基于业务的切换 两个面试问题 想要加快4G切换5G的速度,调哪个参数怎么调高效? 想要减慢5G切换4G的速度调哪个参数怎…

STM32 F1 串口空闲中断 + DMA实现数据发送

DMA实现数据发送 文章目录 DMA实现数据发送前言一、DMA二、代码编写1.DMA2.USART3.main 前言 当你遇到通信数据量大的时候,可以使用 空闲中断 DMA 的方案来减轻 CPU 的压力。 或者 在进行stm32开发时,有时会遇到这种情况:需要在设备间进行数…

字符串原地旋转

记录一下做的练习题 字符串原地旋转:五 三 mat [[1,2,3],[3,4,5],[4,5,6]] tag0 total 0 for i in mat:total total i[tag]tag 1 print(total) 四 X [[12,7,3],[4,5,6],[7,8,9]] Y [[5,8,1],[6,7,3],[4,5,9]] res [[0,0,0],[0,0,0],[0,0,0]] for i in rang…

2024年天津天狮学院市场营销专业《管理学》考试大纲

2024年天津天狮学院专升本市场营销专业高职升本入学考试《管理学》考试大纲 一、考试性质 《管理学》专业课程考试是天津天狮学院市场营销专业高职升本入学考试的必考科 目之一,其性质是考核学生是否达到了升入本科继续学习的要求而进行的选拔性考试。《管理学》考…

STM32 默认时钟更改 +debug调试

STM32时钟 文章目录 STM32时钟前言一、修改系统时钟二、DEBUG 前言 为什么我们要改STM32的时钟呢,打个比方在做SPI驱动的时候,需要16M的时钟,但是stm32默认是72的分频分不出来,这个时候我们就要改系统时钟了,那么怎么…

人工智能基础_机器学习050_对比sigmoid函数和softmax函数的区别_两种分类器算法的区别---人工智能工作笔记0090

可以看到最上面是softmax的函数对吧,但是如果当k = 2 那么这个时候softmax的函数就可以退化为sigmoid函数,也就是 逻辑斯蒂回归了对吧 我们来看一下推导过程,可以看到上面是softmax的函数 可以看到k=2 表示,只有两个类别对吧,两个类别的分类不就是sigmoid函数嘛对吧,所以说 …

算法设计与分析(贪心法)

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需…

Git基础命令,一篇搞懂!(命令行模式,无IDEA)

1.概述 Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库…

城市生命线丨桥梁结构健康监测系统的作用

在城市建设当中,有非常多的城市基本建设,建设当中,桥梁作为不可忽视的一环,也需要有很多桥梁建设的智能监测系统,在这个桥梁结构健康监测系统中,桥梁的各个数值都能被监测得到。 WITBEE万宾使用城市生命线智…

【记录】有关接口响应很快,但是在页面渲染的时候发现很慢的问题

请求数据返回的时候,接口响应的速度是很快的,但是数据量很大,导致返回的报文体很多兆,如果服务器的带宽不够大的话,会有些慢,我这边的例子是3m的数据平均需要大概5~10秒的时间。 思路:开启压缩…

【教学类-06-12】20231126 (二)三位数 如何让加减乘除题目从小到大排序(以0-110之间加法为例,做正序排列用)

结果展示 背景需求: 二位数:去0 三位数(需要排除很多0) 解决思路 一、把数字改成三位数 二、对数组内的题目,8种可能性进行去“0”处理 1、十位数(去百位数0)十位数(去百位数0&am…

百家号MCN是什么?百家号MCN禁止拉子账号怎么解决?

在当今数字化时代,社交媒体平台已成为人们获取信息、分享观点和创作内容的重要渠道之一。百家号作为百度旗下的自媒体平台,吸引了众多创作者和机构入驻,以分享优质内容并获得收益。在百家号上,MCN矩阵扮演着重要的角色&#xff0c…

LeetCode Hot100 543.二叉树的直径

题目: 给你一棵二叉树的根节点,返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 方法:灵神 代码: ​…

哈希思想的应用

目录 1.位图 位图的实现 题目变形一 题目变形二 题目变形三 总结: 2.布隆过滤器 概念 布隆过滤器的实现 3.哈希切割的思想 1.位图 哈希表和位图是数据结构中常用的两种技术。哈希表是一种数据结构,通过哈希函数把数据和位置进行映射&#xff0c…

Alfred v5.1.4(mac快速启动)

Mac效率办公软件哪个好?Alfred是一款Mac电脑上的快速启动和工作流自动化工具,它可以帮助用户快速访问文件、应用程序、web搜索和系统工具,提高工作效率。以下是Alfred的特点: 快速启动:用户可以通过Alfred快速启动应用…

【Linux】bash 终端指令

进程 $ ps aux | grep pwd work 63317 0.0 0.0 51192 612 pts/9 S 14:22 0:00 grep /home/work/search/1000000.dyenv-user-diaoyan-baiseCliPlus-baisePlus-195522.diaoyan.yq/ala-ac/output_root端口 查看本机端口开放情况 $ netstat -tln | grep 3200 tcp…