宁德蕉城城乡建设网站,个人注册登录,石家庄最新消息发布,站长论坛文章目录 手机软件何时统一——桥接模式凭什么你的游戏我不能玩紧耦合的程序演化合成#xff0f;聚合复用原则松耦合的程序桥接模式桥接模式基本代码 手机软件何时统一——桥接模式
凭什么你的游戏我不能玩
时间#xff1a;5月31日20点 地点#xff1a;大鸟房间 人物… 文章目录 手机软件何时统一——桥接模式凭什么你的游戏我不能玩紧耦合的程序演化合成聚合复用原则松耦合的程序桥接模式桥接模式基本代码 手机软件何时统一——桥接模式
凭什么你的游戏我不能玩
时间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尽量使用合成聚合尽量不要使用类继承。JDP 合成Composition也有翻译成组合和聚合Aggregation都是关联的特殊种类。
聚合表示一种弱的’拥有’关系体现的是A对象可以包含B对象但B对象不是A对象的一部分合成则是一种强的’拥有’关系体现了严格的部分和整体的关系部分和整体的生命周期一样DPE。比方说大雁有两个翅膀翅膀与大雁是部分和整体的关系并且它们的生命周期是相同的于是大雁和翅膀就是合成关系。而大雁是群居动物所以每只大雁都是属于一个雁群一个雁群可以有多只大雁所以大雁和雁群是聚合关系。
“合成聚合复用原则的好处是优先使用对象的合成聚合将有助于你保持每个类被封装并被集中在单个任务上。这样类和类继承层次会保持较小规模并且不太可能增长为不可控制的庞然大物DP。就刚才的例子你需要学会用对象的职责而不是结构来考虑问题。其实答案就在之前我们聊到的手机与电脑的差别上。”
“哦我想想看手机是不同的品牌公司各自做自己的软件就像我现在的设计一样而PC却是硬件厂商做硬件软件厂商做软件组合起来才是可以用的机器。你是这个意思吗”
“很好我很喜欢你提到的’组合’这个词实际上像’游戏’‘通讯录’MP3音乐播放’这些功能都是软件如果我们可以让其分离与手机的耦合那么就可以大大减少面对新需求时改动过大的不合理情况。”
“好的好的我想想怎么弄你的意思其实就是应该有个’手机品牌’抽象类和’手机软件’抽象类让不同的品牌和功能都分别继承于它们这样要增加新的品牌或新的功能都不用影响其他类了。” 还剩个问题手机品牌和手机软件之间的关系呢大鸟问道。
“我觉得应该是手机品牌包含手机软件但软件并不是品牌的一部分所以它们之间是聚合关系。” “说得好。来试着写写看吧。”
松耦合的程序
小菜经过半小时改动代码如下。
手机软件抽象类 手机品牌类 客户端代码 “感觉如何是不是好很多”
“是呀现在如果要增加一个功能比如手机音乐播放功能那么只要增加这个类就行了。不会影响其他任何类。类的个数增加也只是一个。” “如果是要增加S品牌只需要增加一个品牌子类就可以了。个数也是一个不会影响其他类的改动。” “这显然也符合了我们之前的一个什么设计原则”
“开放-封闭原则。这样的设计显然不会修改原来的代码而只是扩展类就行了。但今天我感受最深的是合成聚合复用原则也就是优先使用对象的合成或聚合而不是类继承。聚合的魅力无限呀。相比继承的确很容易造成不必要的麻烦。”
“盲目使用继承当然就会造成麻烦而其本质原因主要是什么”
“我想应该是继承是一种强耦合的结构。父类变子类就必须要变。”“OK所以我们在用继承时一定要在是’is-a’的关系时再考虑使用而不是任何时候都去使用。”
“大鸟今天这个例子是不是一个设计模式”
“哈当然你看看刚才画的那幅图两个抽象类之间有什么像什么”
“有一个聚合线哈像一座桥。”
“好说得好这个设计模式就叫作’桥接模式’。”
桥接模式 桥接模式Bridge将抽象部分与它的实现部分分离使它们都可以独立地变化。DP “这里需要理解一下什么叫抽象与它的实现分离这并不是说让抽象类与其派生类分离因为这没有任何意义。实现指的是抽象类和它的派生类用来实现自己的对象DPE。就刚才的例子而言就是让’手机’既可以按照品牌来分类也可以按照功能来分类。”
按品牌分类实现结构图: 按软件分类实现结构图: “由于实现方式有多种桥接模式的核心意图是把这些实现独立出来让它们各自变化。这就使得每种实现的变化不会影响其他实现从而达到应对变化的目的。” 桥接模式基本代码 Implementor类 客户端代码 “我觉得桥接模式所说的’将抽象部分与它的实现部分分离’还是不好理解我的理解就是实现系统可能有多角度分类每一种分类都有可能变化那么就把这种多角度分离出来让它们独立变化减少它们之间的耦合。”
“哈小菜说的和GoF说的不就是一回事吗只不过你说的更通俗而人家却更简练而已。也就是说在发现我们需要多角度去分类实现对象而只用继承会造成大量的类增加不能满足开放-封闭原则时就应该要考虑用桥接模式了。”
“哈我感觉只要真正深入地理解了设计原则很多设计模式其实就是原则的应用而已或许在不知不觉中就在使用设计模式了。”
如果对你有帮助就一键三连呗关注点赞收藏我会持续更新更多干货~~