协议定义了一系列方法,遵从了此协议的对象应该实现它们,这样,我们可以用协议把自己所写的API之中的实现细节隐藏起来,将返回的对象设计为遵从此协议的纯id类型。这样,想隐藏的类名就不会出现在API中了。
协议可在某种程度上提供匿名类型。具体的对象类型可以淡化成遵从某协议的id类型,协议里规定了对象所应实现的方法。
使用匿名对象来隐藏类型名称(或类名)
如果具体类型不重要,重要的是对象能够响应(定义在协议里的)特定方法,那么可以使用匿名对象来表示。
// 协议文件
#import <Foundation/Foundation.h>
@protocol EOCDatabaseConnection <NSObject>
- (void)connect;
- (void)disConnect;
- (BOOL)isConnect;
@end
// 遵循协议的类 头文件
#import <Foundation/Foundation.h>
#import "EOCDatabaseConnection.h"
@interface EOCDBConnection : NSObject<EOCDatabaseConnection>
@end
// 实现文件
#import "EOCDBConnection.h"
@implementation EOCDBConnection
- (void)connect
{
NSLog(@"connect");
}
- (void)disConnect
{
NSLog(@"disConnect");
}
- (BOOL)isConnect
{
return YES;
}
@end
// 提供匿名函数 头文件
#import <Foundation/Foundation.h>
@protocol EOCDatabaseConnection;
@interface EOCDatabaseManager : NSObject
+ (id)shareInstance;
- (id<EOCDatabaseConnection>)connectionWithIdentifier:(NSString *)identifier;
@end
// 实现文件
#import "EOCDatabaseManager.h"
#import "EOCDBConnection.h"
@implementation EOCDatabaseManager
+ (id)shareInstance
{
static dispatch_once_t predicate;
static EOCDatabaseManager *sharedManager;
dispatch_once(&predicate, ^{
sharedManager = [[EOCDatabaseManager alloc] init];
});
return sharedManager;
}
- (id<EOCDatabaseConnection>)connectionWithIdentifier:(NSString *)identifier
{
if ([identifier isEqualToString:@"test"]) {
EOCDBConnection *connection = [[EOCDBConnection alloc] init];
return connection;
}
return nil;
}
@end
// 测试例子:
EOCDatabaseManager *manager = [EOCDatabaseManager shareInstance];
id<EOCDatabaseConnection> connect = [manager connectionWithIdentifier:@"test"];
[connect connect];
网友评论