手机软件何时统一——桥接模式

文章目录

  • 手机软件何时统一——桥接模式
    • 凭什么你的游戏我不能玩
    • 紧耦合的程序演化
    • 合成/聚合复用原则
    • 松耦合的程序
    • 桥接模式
    • 桥接模式基本代码

手机软件何时统一——桥接模式

凭什么你的游戏我不能玩

时间:5月31日20点  地点:大鸟房间  人物:小菜、大鸟

今天是618活动的启动日,小菜果断上手了一台PS4,正憧憬着到货开机的场景,思绪却飘到了2007年,那一年,手机市场没有苹果、没有华为,只有诺基亚、摩托罗拉、索爱、波导……群雄逐鹿,好不热闹……

"大鸟,捧着个手机,玩什么呢?"小菜冲进了大鸟的房门。

“哈,玩小游戏呢,新买的手机,竟然可以玩小时候的游戏’魂斗罗’。很久没碰这东西了,感觉很爽哦。”

在这里插入图片描述

“哦,是吗,连这游戏都有呀,给我看看。”

"等等,等我死了再说。"大鸟玩得正开心。

"等你死了?"小菜笑道,“你什么时候会’死’呀?”

“那还有段时间了,至少半小时吧。”

"半小时才死呀,哦,那我半小时后来给你收尸。"小菜故意提高嗓门。

"你小子,找死呀。给你给你!"大鸟笑着把手机递给了小菜,“游戏和红白机上的一模一样,很让人怀旧呀。唉,我跟你们这种90后小子说红白机,不就等于对牛弹琴吗!”

“怎么没玩过,我可也是任天堂红白机高手哦。大鸟别把我想得好像和你不是一代人一样,我们的童年应该差不多的。”

“现在时代变化太快了,差五岁,差不多就是差一代人,你是90后,我是80后,我们的童年差距当然很大。”

“哪有这么严重,'魂斗罗’也是我很喜欢的游戏。对了,这游戏可以装到我的手机里吗?”

“你的手机是M品牌的吧,我的是N品牌的,按道理我这里的游戏你是不能玩的。”

“是吗,这真是太扫兴了。你说这手机为什么不能统一一下软件呢?”

“其实手机真正的发展也就近十年,此期间各大手机厂商都发展自己的软件部门开发手机软件,哪怕是同一品牌的手机,不同型号的也完全有可能软件不兼容。”

"是的是的,"小菜点头道,“我以前用过的N品牌的两款手机,功能都是固化在手机里的,最早那个手机的拼音输入法实在是傻得要死,要发个短信得输入半天,和现在的输入法比真可说是天壤之别。而且当年,同品牌的手机,型号不同,软件还算是基本兼容,可惜不同品牌,软件基本还是不能整合在一起。”

“但你有没有想过,在计算机领域里,就完全不一样了。比如由于有了Windows操作系统,使得所有的PC厂商不用关注软件,而软件制造商也不用过多关注硬件,这对计算机的整体发展是非常有利的。而有个别品牌的电脑公司自己开发操作系统和应用软件,尽管充满了创意,但却因为不能与其他软件整合,而使得发展缓慢,连盗版都不愿意光顾它。”

“哈,手机为什么不可以学计算机呢?由专业公司开发操作系统和应用软件,手机商只要好好把手机硬件做好就行了。”

“统一谈何容易,谁做的才算是标准呢?而谁又不希望自己的硬件和软件成为标准,然后一统天下。这里有很多商业竞争的问题,不是我们想的这么简单。不过目前很多智能手机都在朝这个方向发展。或许过几年,我们手里的机器就可以实现软件完全兼容了。”

“我想那时应该就不叫作手机了,而是掌上电脑才更合适。”

注:2007年苹果手机尚未出世,手机操作系统多种多样(黑莓、塞班、Tizen等),互相封闭。而如今,存世的手机操作系统只剩下苹果OS和安卓,鸿蒙正在稳步进场,虽然还没有谁能一统天下,但比起当年群雄混战的状态已经算是井然有序了。本章内容也将在2007年那个特定的历史背景下展开……

紧耦合的程序演化

“说得有道理,另外你有没有想过,这里其实蕴含两种完全不同的思维方式?”

“你是说手机硬件软件和PC硬件软件?”

“对的,如果我现在有一个N品牌的手机,它有一个小游戏,我要玩游戏,程序应该如何写?”

“这还不简单。先写一个此品牌的游戏类,再用客户端调用即可。”

游戏类:

在这里插入图片描述

“很好,现在又有一个M品牌的手机,也有小游戏,客户端也可以调用,如何做?”“嗯,我想想,两个品牌,都有游戏,我觉得从面向对象的思想来说,应该有一个父类’手机品牌游戏’,然后让N和M品牌的手机游戏都继承于它,这样可以实现同样的运行方法”。

“小菜不错,抽象的感觉来了。”

手机游戏类:

在这里插入图片描述

“然后,由于手机都需要通讯录功能,于是N品牌和M品牌都增加了通讯录的增删改查功能。你如何处理?”

“啊,这就有点麻烦了,那就意味着,父类应该是’手机品牌’,下有’手机品牌M’和’手机品牌N’,每个子类下各有’通讯录’和’游戏’子类。”

代码结构图:

在这里插入图片描述

手机类:

在这里插入图片描述

下属的各自通讯录类和游戏类:

在这里插入图片描述

客户端代码:

在这里插入图片描述

“哈,这个结构应该还是可以的,现在我问你,如果我现在需要每个品牌都增加一个音乐播放功能,你如何做?”

“这个?那就在每个品牌的下面都增加一个子类。”

"你觉得这两个子类差别大不大?"大鸟追问道。

"应该是不大的,不过没办法呀,因为品牌不同,增加功能就必须要这样的。"小菜无奈地说。

“好,那我现在又来了一家新的手机品牌’S’,它也有游戏、通讯录、音乐播放功能,你如何处理?”

“啊,那就得再增加’手机品牌S’类和三个下属功能子类。这好像有点麻烦了。”

“你也感觉麻烦啦?如果我还需要增加’输入法’功能、‘拍照’功能,再增加’L品牌’‘X品牌’,你的类如何写?”

"啊哦,"小菜学了一声唐老鸭的叫声,感慨道,“我要疯了。要不这样,我换一种方式。”

过了几分钟,小菜画出了另一种结构图。

在这里插入图片描述

“你觉得这样子问题就可以解决吗?”

"啊,"小菜摇了摇头,“不行,要是增加手机功能或是增加品牌都会产生很大的影响。”

“你知道问题出在哪里吗?”

"我不知道呀,"小菜很疑惑,“我感觉我一直在用面向对象的理论设计的,先有一个品牌,然后多个品牌就抽象出一个品牌抽象类,对于每个功能,就都继承各自的品牌。或者,不从品牌,从手机软件的角度去分类,这有什么问题呢?”

"是呀,就像我刚开始学会用面向对象的继承时,感觉它既新颖又功能强大,所以只要可以用,就都用上继承。这就好比是**‘有了新锤子,所有的东西看上去都成了钉子**。[DPE]’

但事实上,很多情况用继承会带来麻烦。比如,对象的继承关系是在编译时就定义好了,所以无法在运行时改变从父类继承的实现。子类的实现与它的父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化。当你需要复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类替换。这种依赖关系限制了灵活性并最终限制了复用性[DP]。"

“是呀,我这样的继承结构,如果不断地增加新品牌或新功能,类会越来越多的。”

"在面向对象设计中,我们还有一个很重要的设计原则,那就是合成/聚合复用原则。即优先使用对象合成/聚合,而不是类继承[DP]。

合成/聚合复用原则

合成/聚合复用原则(CARP),尽量使用合成/聚合,尽量不要使用类继承。[J&DP]

合成(Composition,也有翻译成组合)和聚合(Aggregation)都是关联的特殊种类。

聚合表示一种弱的’拥有’关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分;合成则是一种强的’拥有’关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样[DPE]。比方说,大雁有两个翅膀,翅膀与大雁是部分和整体的关系,并且它们的生命周期是相同的,于是大雁和翅膀就是合成关系。而大雁是群居动物,所以每只大雁都是属于一个雁群,一个雁群可以有多只大雁,所以大雁和雁群是聚合关系。"
在这里插入图片描述

合成/聚合复用原则的好处是,优先使用对象的合成/聚合将有助于你保持每个类被封装,并被集中在单个任务上。这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物[DP]。就刚才的例子,你需要学会用对象的职责,而不是结构来考虑问题。其实答案就在之前我们聊到的手机与电脑的差别上。”

“哦,我想想看,手机是不同的品牌公司,各自做自己的软件,就像我现在的设计一样,而PC却是硬件厂商做硬件,软件厂商做软件,组合起来才是可以用的机器。你是这个意思吗?”

“很好,我很喜欢你提到的’组合’这个词,实际上,像’游戏’‘通讯录’'MP3音乐播放’这些功能都是软件,如果我们可以让其分离与手机的耦合,那么就可以大大减少面对新需求时改动过大的不合理情况。”

“好的好的,我想想怎么弄,你的意思其实就是应该有个’手机品牌’抽象类和’手机软件’抽象类,让不同的品牌和功能都分别继承于它们,这样要增加新的品牌或新的功能都不用影响其他类了。”

在这里插入图片描述

"还剩个问题,手机品牌和手机软件之间的关系呢?"大鸟问道。

“我觉得应该是手机品牌包含手机软件,但软件并不是品牌的一部分,所以它们之间是聚合关系。”

在这里插入图片描述

“说得好。来试着写写看吧。”

松耦合的程序

小菜经过半小时,改动代码如下。

手机软件抽象类:

在这里插入图片描述

手机品牌类:

在这里插入图片描述

客户端代码:

在这里插入图片描述

“感觉如何?是不是好很多?”

“是呀,现在如果要增加一个功能,比如手机音乐播放功能,那么只要增加这个类就行了。不会影响其他任何类。类的个数增加也只是一个。”

在这里插入图片描述

“如果是要增加S品牌,只需要增加一个品牌子类就可以了。个数也是一个,不会影响其他类的改动。”

在这里插入图片描述

“这显然也符合了我们之前的一个什么设计原则?”

“开放-封闭原则。这样的设计显然不会修改原来的代码,而只是扩展类就行了。但今天我感受最深的是合成/聚合复用原则,也就是优先使用对象的合成或聚合,而不是类继承。聚合的魅力无限呀。相比,继承的确很容易造成不必要的麻烦。”

“盲目使用继承当然就会造成麻烦,而其本质原因主要是什么?”

“我想应该是,继承是一种强耦合的结构。父类变,子类就必须要变。”“OK,所以我们在用继承时,一定要在是’is-a’的关系时再考虑使用,而不是任何时候都去使用。”

“大鸟,今天这个例子是不是一个设计模式?”

“哈,当然,你看看刚才画的那幅图,两个抽象类之间有什么?像什么?”

“有一个聚合线,哈,像一座桥。”

“好,说得好,这个设计模式就叫作’桥接模式’。”

桥接模式

桥接模式(Bridge),将抽象部分与它的实现部分分离,使它们都可以独立地变化。[DP]

“这里需要理解一下,什么叫抽象与它的实现分离,这并不是说,让抽象类与其派生类分离,因为这没有任何意义。实现指的是抽象类和它的派生类用来实现自己的对象[DPE]。就刚才的例子而言,就是让’手机’既可以按照品牌来分类,也可以按照功能来分类。”

按品牌分类实现结构图:

在这里插入图片描述

按软件分类实现结构图:

在这里插入图片描述

“由于实现方式有多种,桥接模式的核心意图是把这些实现独立出来,让它们各自变化。这就使得每种实现的变化不会影响其他实现,从而达到应对变化的目的。”

在这里插入图片描述

桥接模式基本代码

在这里插入图片描述

Implementor类:

在这里插入图片描述

客户端代码:

在这里插入图片描述

“我觉得桥接模式所说的’将抽象部分与它的实现部分分离’,还是不好理解,我的理解就是实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合。”

“哈,小菜说的和GoF说的不就是一回事吗!只不过你说的更通俗,而人家却更简练而已。也就是说,在发现我们需要多角度去分类实现对象,而只用继承会造成大量的类增加,不能满足开放-封闭原则时,就应该要考虑用桥接模式了。”

“哈,我感觉只要真正深入地理解了设计原则,很多设计模式其实就是原则的应用而已,或许在不知不觉中就在使用设计模式了。”

如果对你有帮助,就一键三连呗(关注+点赞+收藏),我会持续更新更多干货~~

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

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

相关文章

四个方法,隐藏word文件中的内容!

Word文件中有些内容想要隐藏,该如何隐藏?今天分享几个方法给大家 方法一: 最简单的方法,将字体颜色与背景颜色设置为一致的,这样就达到了隐藏的效果,选中文字再修改颜色就可以恢复字体 方法二&#xff1a…

新书速览|AI提示工程必知必会

《AI提示工程必知必会》 本书内容 《AI提示工程必知必会》为读者提供了丰富的AI提示工程知识与实战技能。《AI提示工程必知必会》主要内容包括各类提示词的应用,如问答式、指令式、状态类、建议式、安全类和感谢类提示词,以及如何通过实战演练掌握提示词…

Java 实现数据隔离 用户只能查看自己所添加的数据 AOP切片注解

1、项目越来越大,数据量越来越多或造成数据查询数据隔离的问题。当角色的判断在代码里面去添加造成数据查询难以维护,维护数量庞大等问题。所以写了一个注解公共方法,实现注解切片自己去判断 package com.mci.aspect; # 主要方法# Before()…

VMware ESXi 8.0U3 macOS Unlocker OEM BIOS 2.7 Dell HPE 定制版 9 月更新发布

VMware ESXi 8.0U3 macOS Unlocker & OEM BIOS 2.7 Dell HPE 定制版 9 月更新发布 VMware ESXi 8.0U3 macOS Unlocker & OEM BIOS 2.7 标准版和厂商定制版 ESXi 8.0U3 标准版,Dell (戴尔)、HPE (慧与)、Lenovo (联想)、IEIT SYSTEMS (浪潮信息)、Cisco (思…

深入浅出详解Intersection Observer交叉观察器 API

原文地址:原文连接 一、前言 过去,要检测一个元素是否可见或者两个元素是否相交并不容易,很多解决办法不可靠或性能很差。然而,随着互联网的发展,这种需求却与日俱增,比如,下面这些情况都需要…

联想电脑怎么开启vt_联想电脑开启vt虚拟化教程(附intel和amd主板开启方法)

最近使用联想电脑的小伙伴们问我,联想电脑怎么开启vt虚拟。大多数可以在Bios中开启vt虚拟化技术,当CPU支持VT-x虚拟化技术,有些电脑会自动开启VT-x虚拟化技术功能。而大部分的电脑则需要在Bios Setup界面中,手动进行设置&#xff…

QT九月28日

1.实现登录界面 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget>class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget(); }; #endif // WIDGET_H源文件 #include "widget.h" #include <QIcon> #in…

订餐点餐|订餐系统基于java的订餐点餐系统小程序设计与实现(源码+数据库+文档)

订餐点餐系统小程序 目录 基于java的订餐点餐系统小程序设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布…

快递单号物流跟踪管理快速筛选出已签收单号

看着满屏的单号&#xff0c;是不是感觉眼前一黑要查询到什么时候&#xff1f;别灰心&#xff0c;这不快递批量查询高手来了&#xff01;这神器就是用来查询物流的好帮手。一键筛选已签收件单号&#xff0c;并导出表格。有了它&#xff0c;你也能轻松查询大量的单号物流。一起试…

生信初学者教程(十五):差异结果的热图

文章目录 介绍加载R包导入数据画图函数热图输出结果总结介绍 热图是一种数据可视化工具,用于展示矩阵数据中的数值大小,通过颜色的深浅或色调变化来表示不同的数值。通常用于生物信息学、统计学和数据分析等领域,以便直观地比较和分析大量数据。 热图展示的是一个二维的数据…

图神经网络实战——分层自注意力网络

图神经网络实战——分层自注意力网络 0. 前言1. 分层自注意力网络1.1 模型架构1.2 节点级注意力1.3 语义级注意力1.4 预测模块 2. 构建分层自注意力网络相关链接 0. 前言 在异构图数据集上&#xff0c;异构图注意力网络的测试准确率为 78.39%&#xff0c;比之同构版本有了较大…

信息安全工程师(26)物理安全概念与要求

前言 物理安全是网络安全体系中的重要组成部分&#xff0c;它关注于保护物理环境、设备和资源免受未经授权的访问、破坏、损坏或盗窃。 一、物理安全概念 物理安全&#xff0c;也称为实体安全&#xff0c;是指通过采取各种物理措施来保护支持网络信息系统运行的硬件&#xff08…

你还在用Java8吗?

Java 11 在企业中&#xff0c;Java的不同版本使用情况随着时间在不断变化。根据最新的数据报告&#xff0c;以下是一些关键点&#xff1a; Java 11 和 Java 17 成为企业中最常用的长期支持&#xff08;LTS&#xff09;版本&#xff0c;使用率分别为 48% 和 45%&#xff0c;而 …

1Panel安装部署证书(httpsok.com)

1Panel安装部署证书(httpsok.com) 购买服务器 推荐购买香港服务器&#xff0c;这样通过域名访问就不需要备案。 创建静态站点 申请SSL证书 进入 httpsok.com&#xff0c;点击申请证书 输入站点域名 根据提示&#xff0c;添加DNS解析记录 添加成功后&#xff0c;提示域名验证…

免费送源码:Javaspringboot++MySQL springboot 社区互助服务管理系统小程序 计算机毕业设计原创定制

摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受居民的喜爱&#xff0c;社区互助服务管理系统小程序被居民普遍使用&#xff0c;为…

【二叉平衡搜索树】Treap

前置 本篇是平衡树-treap的补充学习笔记。 Treap - 树堆 学习基础&#xff1a;适合一定基础的&#xff1a;比如&#xff0c;实现了经典二叉搜索树&#xff08;常用的几个函数写过&#xff09;&#xff0c; 和二叉堆&#xff08;数组的上浮下沉会写吗&#xff1f;&#xff09;&a…

Win11右键默认显示更多设置教程

Win11最大的变化之一莫过于右键菜单发生了变化&#xff0c;最大的问题是什么&#xff0c;是右键菜单很多时候需要点两次&#xff0c;实在是反人类&#xff0c;太麻烦了。 简直是反人类&#xff01; 必须使用“显示更多选项”的右键菜单。 以管理员方式运行CMD 复制以下命令直…

IP6537_C_30W20V--移动设备快充的得力助手,集成 14 种快充协议的降压 SoC

IP6537_C_30W20V是一款集成同步开关的降压转换器、支 持 14 种输出快充协议、支持 Type-C 输出和 USB PD2.0/PD3.0(PPS)协议的 SoC&#xff0c;为车载充电器、 快充适配器、智能排插提供完整的解决方案。 IP6537_C_30W20V支持 USB Type-C 或者 USB A 输出&#xff0c; 5V 输出功…

C++的STL标准模板库容器--vector类

前言&#xff1a;vector类也可以叫作顺序表&#xff0c;他同样也在STL库中的容器模块中&#xff0c;我还是主要讲常用的几个成员函数和成员变量&#xff0c;同时它晚于string类&#xff0c;所以在设计上没有string冗余。 vector类是一个和数组类似的容器&#xff0c;它属于随机…

插上网线无法连接网络,控制面板以太网消失 | 如何重装网络驱动

如果你确定你的网线没问题&#xff0c;网线插口没问题&#xff0c;那你大概率就是驱动问题&#xff0c;可以试一下本方法。 0 以太网消失 事情是这样的&#xff0c;我工作时候需要接内网&#xff0c;插网线&#xff0c;摸鱼时候连外网&#xff0c;我就把网线关了。 每次插网线…