iOS开发-适配器和外观模式
适配器模式,属于结构型模式,其主要作用是将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器模式有对象适配器和类适配器两种,类适配器模式需要语言实现多继承,OC不支持多继承,所以一般我们都实现对象适配器。外观模式提供了一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层接口,让子系统更容易使用。适配器是为了转换接口,外观模式是为了简化接口。
适配器模式
对象适配器模式UML类图:
关于适配模式最常见的就是手机充电的例子,通过数据线和转换口连接,然后将转换口和插座连接,转换口就可以理解为适配器~
数据线(Target):
1 2 3 4 5 6 7 8 9 10 11 | @protocol DataLineProtocol <NSObject> @optional -( void )connect; @end @ interface DataLine : NSObject<DataLineProtocol> @end |
电源插头(Adapter):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | @ interface DataAdapter(){ EleSocket *eleSocket; } @end @implementation DataAdapter -(instancetype)initWithEleSocket:(EleSocket *)socket{ self=[super init]; if (self) { eleSocket=socket; } return self; } -( void )connect{ [eleSocket speicalConnect]; } @end |
被适配者(插座):
1 2 3 4 5 6 7 | @implementation EleSocket -( void )speicalConnect{ NSLog( @"specialConnect--电源接通" ); } @end |
客户端(手机):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | @ interface Mobile(){ DataLine *dataLine; } @end @implementation Mobile -(instancetype)initWithDataLine:(DataLine *)line{ self=[super init]; if (self) { dataLine=line; } return self; } -( void )charge{ [dataLine connect]; } @end |
客户端调用:
1 2 3 4 | EleSocket *socket=[[EleSocket alloc]init]; DataLine *line=[[DataAdapter alloc] initWithEleSocket:socket]; Mobile *moblie=[[Mobile alloc]initWithDataLine:line]; [moblie charge]; |
测试结果:
外观模式
外观模式通过引入一个外观角色来简化客户端与子系统之间的交互,为复杂的子系统调用提供一个统一的入口,降低子系统与客户端的耦合度,且客户端调用非常方便。适配器是是接口转换,外观是简化接口,将多个子系统接口转换为一个,最简单的例子就是在饭店吃饭和在家吃饭,如果去饭店吃饭,只需要下单,等个十几二十分钟我们就可以吃饭,在家自己做饭就需要买菜,淘米,炒菜等等一系列动作。
UML类图:
我们简单的模拟一下餐馆点餐的过程需要饭店,服务员,厨师:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | @ interface Hotel(){ Waiter *myWaiter; Cook *myCook; } @end @implementation Hotel -(instancetype)initWithCook:(Waiter *)waiter cook:(Cook *)cook{ self=[super init]; if (self) { myWaiter=waiter; myCook=cook; } return self; } -( void )order{ [myWaiter handleOrder]; [myCook cook]; [myCook complete]; } @end |
客户端调用:
1 2 | Hotel *hotel=[[Hotel alloc]initWithCook:[Waiter new ] cook:[Cook new ]]; [hotel order]; |
关于门面模式的简单实现中我们通过一个接口,可以调用子系统的接口,非常简单,外观模式的优势有以下几点:
①对客户屏蔽子系统组件,减少了客户处理的对象数目并使得子系统使用起来更加容易。通过引入外观模式,客户代码将变得很简单,与之关联的对象也很少。
②实现了子系统与客户之间的松耦合关系,这使得子系统的组件变化不会影响到调用它的客户类,只需要调整外观类即可。
③降低了大型软件系统中的编译依赖性,并简化了系统在不同平台之间的移植过程,因为编译一个子系统一般不需要编译所有其他的子系统。一个子系统的修改对其他子系统没有任何影响,而且子系统内部变化也不会影响到外观对象。
④提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类。
外观模式的缺点:
①不能很好地限制客户使用子系统类,如果对客户访问子系统类做太多的限制则减少了可变性和灵活性。
② 在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。
本文的子系统对象可以从外部传递,如果不希望从外部传递,可以在初始化的时候内部对子系统的进行初始化~
作者:FlyElephant
出处:http://www.cnblogs.com/xiaofeixiang
说明:博客经个人辛苦努力所得,如有转载会特别申明,博客不求技惊四座,但求与有缘人分享个人学习知识,生活学习提高之用,博客所有权归本人和博客园所有,如有转载请在显著位置给出博文链接和作者姓名,否则本人将付诸法律。
出处:http://www.cnblogs.com/xiaofeixiang
说明:博客经个人辛苦努力所得,如有转载会特别申明,博客不求技惊四座,但求与有缘人分享个人学习知识,生活学习提高之用,博客所有权归本人和博客园所有,如有转载请在显著位置给出博文链接和作者姓名,否则本人将付诸法律。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述