ios - objective-c 中适配器模式的正确实现

标签 ios objective-c adapter

我需要为我的应用程序创建一个数据管理器,而无需对一种文件格式进行硬编码,因此如果我想更改保存数据的方式 - 我可以轻松做到。为此,我选择了适配器模式。

我有 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 来转换接口(interface):
#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 并且需要发布很多文件管理器 - 我相信它不是那么好。我对所有这些方法都感到困惑。也许有人可以为我的案例提供更有趣和更简单的这种模式实现?谢谢!

最佳答案

另一种解决方案是在 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/

相关文章:

c++ - "Adapter"为成员变量

ios - 如何禁用 future 日期而不是在 swift 2 中滚动日期选择器

iOS - 触摸 UITextField 外部时关闭键盘

iOS:使用 OpenGL ES 渲染纯粹基于像素的分形效果?

ios - AutoLayout with 2 multiline labels, compression resistance and minimum 1 行标签

java - 在 Listview 适配器中添加项目后,notifyDataSetChanged() 不起作用

ios - 在 ios 中创建自定义进度指示器

iphone - 如何修复 iOS 中的视频方向问题

iphone - 从我的应用程序向 iPhone 的默认日历添加事件

java - 为什么 BaseAdapter 的自定义子类只需要实现 Adapter 接口(interface)中的一些抽象方法?