第28条:通过协议提供匿名对象

协议定义了一系列方法,遵从了此协议的对象应该实现它们,这样,我们可以用协议把自己所写的API之中的实现细节隐藏起来,将返回的对象设计为遵从此协议的纯id类型。这样,想隐藏的类名就不会出现在API中了。

协议可在某种程度上提供匿名类型。具体的对象类型可以淡化成遵从某协议的id类型,协议里规定了对象所应实现的方法。

使用匿名对象来隐藏类型名称(或类名)

如果具体类型不重要,重要的是对象能够响应(定义在协议里的)特定方法,那么可以使用匿名对象来表示。

// 协议文件
#import 

@protocol EOCDatabaseConnection 

- (void)connect;

- (void)disConnect;

- (BOOL)isConnect;

@end

// 遵循协议的类 头文件
#import 
#import "EOCDatabaseConnection.h"

@interface EOCDBConnection : NSObject

@end

// 实现文件
#import "EOCDBConnection.h"

@implementation EOCDBConnection

- (void)connect
{
    NSLog(@"connect");
}

- (void)disConnect
{
    NSLog(@"disConnect");
}

- (BOOL)isConnect
{
    return YES;
}

@end

// 提供匿名函数 头文件
#import 
@protocol EOCDatabaseConnection;

@interface EOCDatabaseManager : NSObject

+ (id)shareInstance;

- (id)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)connectionWithIdentifier:(NSString *)identifier
{
    if ([identifier isEqualToString:@"test"]) {
        EOCDBConnection *connection = [[EOCDBConnection alloc] init];
        return connection;
    }
    return nil;
}

@end

// 测试例子:
EOCDatabaseManager *manager = [EOCDatabaseManager shareInstance];
id connect = [manager connectionWithIdentifier:@"test"];
[connect connect];

你可能感兴趣的:(第28条:通过协议提供匿名对象)