我需要为我的应用程序创建一个数据管理器,而无需对一种文件格式进行硬编码,因此,如果我想更改保存数据的方式-我可以轻松做到。为此,我选择适配器模式。
我在DataManager类中编写了用于存储数据的常规方法。
@protocol DataManagerProtocol
@required
- (void) readFile;
- (void) saveFile;
@end
@interface DataManager : NSObject
{
NSMutableArray *items;
NSMutableString *destPath;
}
// many different methods
@end
比起我有一个DataFileManager,这里有一些用于以一种特定格式存储数据的方法:
@interface DataFileManager : NSObject
- (void) savePlist;
- (void) readPlist;
@end
@implementation DataFileManager
- (void) savePlist
{
NSLog(@"The plist file was saved.");
}
-(void) readPlist
{
NSLog(@"The plist file was readed.");
}
@end
而且我有DataAdapter来转换接口:
#import <Foundation/Foundation.h>
#import "DataFileManager.h"
#import "DataManager.h"
@interface DataAdapter : NSObject <DataManagerProtocol>
{
@private DataFileManager *_dataFileManager;
}
@property (nonatomic, strong) DataFileManager *dataFileManager;
- (id) initWithDataFileManager:(DataFileManager*) adaptee;
@end
@implementation DataAdapter
@synthesize dataFileManager = _dataFileManager;
- (id) initWithDataFileManager:(DataFileManager *) adaptee
{
self = [super self];
_dataFileManager = adaptee;
return self;
}
- (void) saveFile
{
[_dataFileManager savePlist];
}
- (void) readFile
{
[_dataFileManager readPlist];
}
@end
因此,然后在我的DataManager文件中编写该方法:
- (void) saveTheTestFile:(id)forAdapter
{
[forAdapter saveFile];
}
并像这样使用它:
DataFileManager *dataFileManager = [[DataFileManager alloc] init];
DataAdapter *dataAdapter = [[DataAdapter alloc] initWithDataFileManager:dataFileManager];
[self saveTheTestFile:dataAdapter];
它有效,但是我相信这里有些问题-有没有办法使它更简单?我不使用ARC,需要释放大量的fileManager-我认为它不是很好。我完全对所有这些方法感到困惑。也许有人可以为我的案例提供更有趣,更简单的这种模式的实现?谢谢!
最佳答案
另一个解决方案是在DataFileManager类的实现文件内定义的DataManager类上使用类别。
这是一个示例,其外观应为:
//class DataFileManager's implementation
@implementation DataManager (DataFileManager_Adapter)
// Methods to allow DataFileManager to connect to DataManager
// Methods that DataFileManager can use to calculate values dependent on both DataManager
// and DataFileManager
@end
@implementation DataFileManager
// DataFileManager's methods
@end
经典方法是像您所做的那样创建第三种中间类,但是在Objective-C中,类别消除了这种需求。
Adapter interfaces in Objective-C, using categories.
关于ios - objective-c 中适配器模式的正确实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18609056/