Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c objective C中的生成器模式_Objective C_Design Patterns_Data Formats - Fatal编程技术网

Objective c objective C中的生成器模式

Objective c objective C中的生成器模式,objective-c,design-patterns,data-formats,Objective C,Design Patterns,Data Formats,我遇到了一个设计模式“Builder”,我认为它非常适合我想做的事情。在我的iOS应用程序中,我有不同的核心数据实体,我希望能够将我的对象转换为不同的数据格式。目前,我的计划是支持XML、HTML和JSON。因此,我一直在考虑使用标准设计模式(如“Builder”)来设计此解决方案。我的一些问题是 对于这个问题,生成器模式是正确的吗 我可以在目标C中使用此模式吗?由于objc中没有抽象类的概念,所以不知道如何处理这个问题。我想我应该使用一个基类和一个协议来定义我的抽象方法 请随时提出最适合我需要

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

  • 对于这个问题,生成器模式是正确的吗
  • 我可以在目标C中使用此模式吗?由于objc中没有抽象类的概念,所以不知道如何处理这个问题。我想我应该使用一个基类和一个协议来定义我的抽象方法
  • 请随时提出最适合我需要的任何新设计解决方案

    非常感谢您的建议和评论

    问候,, 贾维德


    编辑:另一个关键点是最终格式将由不同的核心数据实体组成。例如,如果存在实体team和player,我需要创建同时使用team和player的数据格式。

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

    例如,如果要将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]);
    
    一些参考资料:

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

    2) 是的,生成器模式可以在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];
        }
    }
    

    你好,jsmp,谢谢你的建议。我想我在问题描述中遗漏了一个关键点。我的最终目标是创建一个使用多个核心数据实体的复杂对象。例如,如果有一个实体团队&玩家,我想创建一个包含所有玩家的团队表示。这可能会有帮助,谢谢Daniel。简单说明一下,ConcreteBuilder类将实现Builder协议,对吗?是的,所有ConcrenteBuilder都将实现Builder协议。创建代码的最佳方法是在构建主管的同时构建一个混凝土构建者,同时关注所有建筑方案的共同点。(导演中有一些常见的东西。)一旦你开始工作,那么制作另外两个混凝土工应该很容易。