我应该使用什么设计模式来构建跨OSX和iOS库?

时间:2012-12-06 15:23:47

标签: objective-c ios macos design-patterns abaddressbook

我正在尝试构建一个具有处理iOS和OSX AddressBook框架(iOS上的联系人列表和OSX上的联系人)的便捷方法的库,并包括以下方法:

  • (BOOL)addressBookContainsRecordWithID:(NSString *)recordID(在OSX的情况下为NSInteger
  • (id)newOrExistingGroupWithName:(NSString *)groupName
  • (id)addressBookRecordWithID:(NSString *)recordID

我希望能够在OSX和iOS上调用这些方法,但是让该方法为每个设备执行相应的逻辑路径。例如,在OSX上,它将使用使用ABPersonABGroup的方法,而在iOS上,它将使用使用ABRecordRef的方法。

我目前的计划是使用预处理程序指令(#if device-is-osx callOSXMethod #else callIOSMethod)来判断我是使用iOS还是OSX并使用正确的方法。

我有更好的方法可以解决这个问题吗?我觉得这里可以使用一些设计模式。

2 个答案:

答案 0 :(得分:3)

这取决于两个不同实现之间的共享代码量。如果除了对AddressBook框架的一些特定方法调用之外几乎所有代码都是共享的,那么使用#if TARGET_OS_IPHONE的预处理器指令就可以了。

另一方面,如果您发现#if块中的代码变得越来越长,将Mac和iOS实现拆分为共享相同接口的单独文件通常更有意义。因此你有:

  • MyAddressBook.h - 由两者共享
  • MyAddressBook_Mac.h - MyAddressBook的Mac实现
  • MyAddressBook_iOS.h - MyAddressBook的iOS实现

通过在每个实现文件中使用类扩展,您的实现甚至可以拥有不同的实例变量,这一点变得更加容易。第二种模式导致更高的可读性,代价是必须维护两个地方的常用代码。

答案 1 :(得分:1)

预处理器指令是要走的路。甚至可以使用预定义的:

#if TARGET_OS_IPHONE
    // iOS code here
#else
    // OS X code here
#endif