iOS设计模式四部曲(二):结构型模式 内附Demo

本篇是四部曲的第二篇,第一篇请点这里iOS设计模式四部曲(一):创建型模式 内附Demo,关于设计模式强烈推荐图书《Head First设计模式》以及《研磨设计模式》。由于个人能力有限,文中难免有一些遗漏或者错误,请各位看官不吝赐教!谢谢!本文所有Demo可以在我的Git上获取,请点击这里

第二篇来了

设计模式.png

废话不多说,上图是整个设计模式的目录,这篇文章是其中的第二部分:结构型模式。结构型模式包括:适配器模式(Adapter)桥接模式(Bridge)装饰器模式(Decorator)组合模式(Composite)外观模式(Facade)享元模式(Flyweight)代理模式(Proxy)。下面我们就开始吧~


适配器模式(Adapter):

1.定义: 适配器模式将一个类的接口变成调用者所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。(举一个现实中的实例:比如转接头)。
2. 使用场景: 扩展应用或者组件时,而被集成进来的又不符合现在的接口,这个时候可以考虑使用适配器模式。
3. 具体实现: 这里用举一个实际的例子,同声传译。举了一个虚拟的国际大会场景,主持人只会说英语,然后马云先生又听不懂英语(当然只是假设,事实是说的比中文都6),在乔布斯演讲之后,就到马云演讲,这个时候就需要一个翻译,去告诉马云可以开始你的表演啦😄,具体Demo点击这里查看
4.优点: 通过使用适配器让不兼容的接口变成了兼容,让调用者从实现类的接口解耦。在不修改原有代码的基础上增加新的适配器类,所以灵活性和扩展性比较好,哪天不想用了,就一起卸载掉。
5.缺点: 只有集成具有类似功能的组件时,适配器模式才具有使用价值。具有相似功能具体指:API不一样,但是功能是相似的。
6.注意事项: 适配器模式一般不是为了解决还处在于开发阶段的问题,一般都是解决正在服役项目的扩展问题。


桥接模式(Bridge):

1.定义: 桥接模式就是将抽象部分和实现部分解耦,从而使得两者可以独立的变化。
2. 使用场景: 重用性要求较高的不希望或不适用使用继承的场景。也就是说当继承N层,达到层级有点爆炸的时候可以考虑使用此模式。
3. 具体实现: 这里举了一个App不同模块可以切换不同主题的例子,桥接模式主打的是组合优于继承,具体Demo点击查看,如果没有用桥接模式的话,可能就会出现MyRedModuleMyBlueModule这样的类
4.优点: 此模式分离了应用的抽象部分与实现部分,有利于扩充。
5.缺点: 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。
6.注意事项: 并不是一涉及继承就要考虑使用桥接模式,不然还要继承做什么?桥接模式的目的就是要对变化进行封装,尽可能的把变化的因素封装到最细最小的单元中,避免风险扩散。所以当发现类的继承有N层的时候,才需要去考虑使用该模式。


装饰器模式(Decorator):

1.定义: 装饰模式能动态的给一个对象添加一些额外的职责。就增加功能来说,装饰模式会比通过继承生成子类更为灵活。
2. 使用场景: 需要动态地给一个对象增加功能,这些功能也可以动态地被撤销。
3. 具体实现: Objective-C中的Category 就是装饰器模式的一种应用。这里举了一个鸡肉堡的例子,具体Demo点击查看
4.优点: 装饰器模式中定义的行为,能够在不创建大量子类的情况下,组合起来实现复杂的效果,比继承更加灵活。
5.缺点: 装饰器模式会导致设计中出现许多的小对象,会让系统变得更加复杂,比如说出错调试时寻找错误可能需要逐级排查。


组合模式(Composite):

1.定义: 组合模式将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
2. 使用场景: 维护和展示部分-整体关系的场景,在具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异,可以一致地对待它们的时候。
3. 具体实现: 这里举一个文件系统的例子


这里有这个目录下有文件夹Compositemain实现文件文件夹Composite下有实现文件头文件Demo点击这里查看

4.优点: 1.高层模块调用简单。2.节点自由增加,而不必更改原来代码。3.叶子对象可以被组合成更复杂的容器对象,而这个容器对象又可以被组合,这样不断递归下去,可以形成复杂的树形结构。
5.缺点: 使设计变得更加抽象,对象的业务规则如果很复杂,则实现组合模式具有很大挑战性,而且不是所有的方法都与叶子对象子类都有关联。
6.注意事项: 当使用这个属性结构的调用组件能够通过同一个类或者协议来使用书中包含的所有的对象时,才能证明正确的实现了此模式。


外观模式(Facade):

1.定义: 外观模式要求一个子系统的外部与内部的通信必须通过一个统一的对象进行。外观模式提供一个高层次的接口,用来访问子系统中的一群接口。
2. 使用场景: 当一个复杂子系统需要提供一个简单的调用接口时可以使用外观模式。
3. 具体实现: 外观模式比较容易理解,这里举一个家电管家的例子,命令起床,命令睡觉。家电管家帮你做关灯,拉窗帘等等一系列操作。具体Demo请点击这里查看
4.优点: 使用此模式可以将复杂的API代码隐藏到一个简单的接口中,减少调用者直接对复杂API的依赖和耦合。修改时也只需要修改简单的接口即可。
5.缺点: 不太遵守开闭原则,一旦发现有一些操作的时候,或者在增加新的子系统的时候,可能需要修改外观类代码,可能会造成一些风险。


享元模式(Flyweight):

1.定义: 享元模式就是运行共享技术有效地支持大量细粒度对象的复用
2. 使用场景: 系统中存在大量的相似对象,由于这类对象的大量使用可能会造成系统内存资源浪费,而且这些对象的状态大部分可以外部化,这个时候可以考虑享元模式。在iOS中,我们用到的UITableView 重用机制就是享元模式的典型应用。
3. 具体实现: 这里通过了一个画圆的Demo来演示一下享元模式,具体Demo请点击这里查看
4.优点: 通过共享极大的减少了对象实例的个数,节省了内存开销。
5.缺点: 1.提高了系统的复杂度,需要分离出外部状态和内部状态。 2.这些类必须有一个工厂对象加以控制。


代理模式(Proxy):

1.定义: 代理模式为其他对象提供一种代理以控制对这个对象的访问。
2. 使用场景: 想在访问一个类时做一些控制。
3. 具体实现: 这里举一个实际的例子,就是火车票代售点,具体实现Demo请点击这里查看
4.优点: 1、职责清晰。 2、高扩展性。
5.缺点: 增加了系统的复杂度
6.注意事项: 1、和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。 2、和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。


EOF:这篇文章通过Demo梳理了设计模式中的结构型模式,由于个人能力有限,难免有一些遗漏或者错误,还请各位看官不吝赐教! 最近工作有点忙,剩下的部分会尽量抽时间早点完成。本文已同步到个人博客欢迎关注,欢迎点赞,欢迎star,欢迎一起交流,一起进步!🤓

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容