iOS 设计模式-外观模式
1.外观模式简介
外观模式(Facade)在开发过程中的运用频率非常高,尤其是在现阶段各种第三方SDK充斥在我们的周边,而这些SDK很大概率会使用外观模式。通过一个外观类使得整个系统的接口只有一个统一的高层接口,这样能够降低用户的使用成本,也对用户屏蔽了很多实现细节。当然,在我们的开发过程中,外观模式也是我们封装API的常用手段,例如网络模块、ImageLoader模块等。
2.外观模式定义
外观模式又叫门面模式。外观模式为子系统中一组不同的接口提供统一的接口。外观模式定义了上层接口,通过降低复杂度和隐藏子系统间的通信及依存关系,让子系统更易于使用。
3.外观模式的使用场景
3.1 为一个复杂子系统提供一个简单接口。子系统往往因为不断演化而变得越来越复杂,甚至可能被替换。大多数模式使用时都会产生更多、更小的类,在这使子系统更具可重用性的同时也更容易对子系统进行定制、修改,这种易变性使得隐藏子系统的具体实现变得尤为重要。Facade可以提供一个简单统一的接口,对外隐藏子系统的具体实现、隔离变化。
3.2 当你需要构建一个层次结构的子系统时,使用Facade模式定义了子系统中每层的入口点。如果子系统之间是相互依赖的,你可以让它们仅通过Facade接口进行通信,从而简化了它们之间的依赖关系。
4.外观模式的UML 图
5.角色划分
外观角色(Facade):是模式的核心,他被客户client角色调用,知道各个子系统的功能。同时根据客户角色已有的需求预订了几种功能组合
子系统角色(Subsystem classes):实现子系统的功能,并处理由Facade对象指派的任务。对子系统而言,facade和client角色是未知的,没有Facade的任何相关信息;即没有指向Facade的实例。
6.Demo 实践
业务场景如下:
有一位乘客需要乘坐出租车,出租车司机为驾驶出租车的一组复杂接口提供了一个简化了的接口。如图:
通过此图可以看出整个出租车服务作为一个封闭系统,包括一名出租车司机(外观角色)、一辆车(子系统角色)、一个计价器(子系统角色)。同系统交互的唯一途径是通过CabDriver中定义的接口driveToLocation:x。一旦乘客(客户client角色)向出租车司机发出driveToLocation:x消息。CabDriver就会收到消息。司机需要操作两个子系统---Taximeter(计价器)和Car。CabDriver先启动(start)Taximeter,让他开始计价,然后司机对汽车会松刹车(releaseBrakes)、换挡(changeGears)、踩油门(pressAccelerator),把车开走。直到到达了地点x,CabDriver会松油门(releaseAccelerator)、踩刹车(pressBrakes)、停止(stop)Taximeter,结束行程。
一切都发生于发给CabDriver的一个简单的driveToLocation:x命令之中。无论两个子系统有多么复杂,它们隐藏于乘客的实现之外。因为CabDriver是在为出租车子系统中的其他复杂接口提供了一个简化的接口。CabDriver像“外观”一样,处于乘客与出租车子系统之间。
参考代码地址:https://github.com/zhiyoukaifa/Pattern
总结:
外观模式是一个高频率使用的设计模式,它的精髓就在于封装二字。通过一个高层次结构为用户提供统一的API入口,使得用户通过一个类型就基本能够操作整个系统,这样减少了用户的使用成本,也能够提升系统的灵活性。
优点:
1.对客户屏蔽子系统组件,减少了客户处理的对象数目并使得子系统使用起来更加容易。通过引入外观模式,客户代码将变得很简单,与之关联的对象也很少。
2.实现了子系统与客户之间的松耦合关系,这使得子系统的组件变化不会影响到调用它的客户类,只需要调整外观类即可。
3.降低了大型软件系统中的编译依赖性,并简化了系统在不同平台之间的移植过程,因为编译一个子系统一般不需要编译所有其他的子系统。一个子系统的修改对其他子系统没有任何影响,而且子系统内部变化也不会影响到外观对象。
4.只是提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类。
缺点:
1.外观类接口膨胀。由于子系统的接口都有外观类统一对外暴露,使得外观类的API接口较多,在一定程度上增加了用户使用成本。
2.不能很好地限制客户使用子系统类,如果对客户访问子系统类做太多的限制则减少了可变性和灵活性。
3.在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。
参考书籍:
《Objective-C编程之道 iOS设计模式解析》
《Android源码设计模式解析与实战》
参考链接:
https://www.cnblogs.com/wuchanming/p/4483140.html

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android APP全面屏适配技术要点
全面屏的概念 为什么先要解释一下全面屏,因为这个词在现在来讲就是一个伪命题。全面屏字面意思就是手机的正面全部都是屏幕,100%的屏占比。但是现在推出所谓“全面屏”手机的厂商没有一个能达到全面的。 那么下面来说一下Android开发领域对全面屏的理解和定义吧。 一般手机的屏幕纵横比为16:9,如1080x1920、1440x2560等,其比值为1.77,在全面屏手机出现之前,Android中默认的最大屏幕纵横比(maximum aspect ratio)为1.86,即能够兼容16:9的屏幕。 一些手机厂商为了追求更大的屏幕空间以及更极致的用户体验,于是提高了屏幕纵横比,17:9、19:10、18:9、18.5:9的手机开始进入市场,这些手机的屏幕纵横比大大超过了1.86,这些手机被称为全面屏手机。 为何需要适配 我们将targetSdkVersion的值改为小于等于23,运行程序,我们会发现屏幕底部出现一个黑条。 image 如何适配 targetSdkVersion<=23,更大的屏幕纵横比 在Galaxy S8发布之后,Android官方提供了适配方案,即提高App所支持的最大...
- 下一篇
烟沙浮生 | 此间少年(2018-10-15 第五周记)
蝉声陪伴着行云流浪回忆开始后安静遥望远方“诶,同学,刚刚是你吹的笛子吗”“额,嗯,是,怎么了”“好听~吹得我快掉眼泪了。。。”......(来自10.13,收摊前,一个挺有感触的瞬间) 那一刻再次体会到, 乐器这种东西,一拿起来, 别人就有可能透过那抑扬之声, 看到你内心一角幻化而出的世界吧。。 匆匆忙忙,行程紧凑爆肝的一周, 如梦似幻结束了 补坑:周一到周五 计网代理服务器录屏, 肝ROS、总线、操作系统作业 肝项目文档, 肝Android文档, 百团大战:周一三五六 从地库到篮球场到排球场 周末: 同乡会聚餐 老友生日 敬老院重阳敬老 移动联盟分享会 不甘社分享会 秋风起了, 长风不绝呢
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS关闭SELinux安全模块
- CentOS8安装Docker,最新的服务器搭配容器使用
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Windows10,CentOS7,CentOS8安装Nodejs环境
- 设置Eclipse缩进为4个空格,增强代码规范