标签:
适配器模式,属于结构型模式,其主要作用是将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器模式有对象适配器和类适配器两种,类适配器模式需要语言实现多继承,OC不支持多继承,所以一般我们都实现对象适配器。外观模式提供了一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层接口,让子系统更容易使用。适配器是为了转换接口,外观模式是为了简化接口。
对象适配器模式UML类图:
关于适配模式最常见的就是手机充电的例子,通过数据线和转换口连接,然后将转换口和插座连接,转换口就可以理解为适配器~
数据线(Target):
@protocol DataLineProtocol <NSObject> @optional -(void)connect; @end @interface DataLine : NSObject<DataLineProtocol> @end
电源插头(Adapter):
@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
被适配者(插座):
@implementation EleSocket -(void)speicalConnect{ NSLog(@"specialConnect--电源接通"); } @end
客户端(手机):
@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
客户端调用:
EleSocket *socket=[[EleSocket alloc]init]; DataLine *line=[[DataAdapter alloc] initWithEleSocket:socket]; Mobile *moblie=[[Mobile alloc]initWithDataLine:line]; [moblie charge];
测试结果:
外观模式通过引入一个外观角色来简化客户端与子系统之间的交互,为复杂的子系统调用提供一个统一的入口,降低子系统与客户端的耦合度,且客户端调用非常方便。适配器是是接口转换,外观是简化接口,将多个子系统接口转换为一个,最简单的例子就是在饭店吃饭和在家吃饭,如果去饭店吃饭,只需要下单,等个十几二十分钟我们就可以吃饭,在家自己做饭就需要买菜,淘米,炒菜等等一系列动作。
UML类图:
我们简单的模拟一下餐馆点餐的过程需要饭店,服务员,厨师:
@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
客户端调用:
Hotel *hotel=[[Hotel alloc]initWithCook:[Waiter new] cook:[Cook new]]; [hotel order];
关于门面模式的简单实现中我们通过一个接口,可以调用子系统的接口,非常简单,外观模式的优势有以下几点:
本文的子系统对象可以从外部传递,如果不希望从外部传递,可以在初始化的时候内部对子系统的进行初始化~
标签:
原文地址:http://www.cnblogs.com/xiaofeixiang/p/5123168.html