1

我遇到了一种设计模式“Builder”,我认为它非常适合我想做的事情。在我的 iOS 应用程序中,我有不同的核心数据实体,我希望能够将我的对象转换为不同的数据格式。目前,我的计划是支持 XML、HTML 和 JSON。所以,我一直在考虑使用像“Builder”这样的标准设计模式来设计这个解决方案。我的一些问题是

  1. 建造者模式是解决这个问题的正确模式吗?
  2. 我可以在 Objective C 中使用这种模式吗?由于 Obj C 中没有抽象类概念,因此不知道如何处理。我在想我应该使用基类和协议来定义我的抽象方法。

请随时提出最适合我需求的任何新设计解决方案。

非常感谢您的建议和意见。

问候,贾维德

编辑:另一个关键点是最终格式将包含不同的核心数据实体。例如,如果有实体球队和球员,我需要创建一个同时使用球队和球员的数据格式。

4

2 回答 2

1

您可以使用类别来扩展对象的行为。

例如,如果您想将功能 stringJSON 添加到 NSDictionary 中,您可以执行以下操作:

NSDictionary+JSON.h:

@interface NSDictionary (json)
-(NSString *) stringJSON;
@end

NSDictionary+JSON.m

@implementation NSDictionary (json)
-(NSString *) stringJSON {
    return @"{key:\"...\"}";
}
@end

现在,在任何.m文件中,您想在 NSDictionary 对象上使用此新方法,包括类别

#include "NSDictionary+JSON.h"

并像这样使用:

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"value",@"key", nil];
NSLog(@"%@",[dict stringJSON]);

一些参考资料:http: //developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocCategories.html#//apple_ref/doc/uid/TP30001163-CH20-SW1

http://cocoadevcentral.com/d/learn_objectivec/

于 2011-04-20T22:18:34.680 回答
1

1) 是的,Builder 模式听起来是解决这个问题的好方法。Builder 背后的想法是整个构建过程在所有数据格式中都是一致的,但构建细节不同。

2)是的,Builder模式可以在Objective C中使用。Director和各种ConcreteBuilder类都是普通类,而Builder抽象类将是Director使用的协议,如果它被表示的话。

你可能会在导演中得到这样的结果:

@implementation Director
- (void)construct {
    for (Team* team in self.allTeams) {
        [self.builder buildTeamStart];
        for (Player* player in team.allPlayers)
            [self.builder buildPlayer];
        [self.builder buildTeamEnd];
    }
}
于 2011-04-21T12:00:24.010 回答