【问题标题】:Passing an object between many classes with the least coupling possible在多个类之间传递一个对象,尽可能减少耦合
【发布时间】:2012-07-29 08:35:59
【问题描述】:

在我的应用程序中,我使用了一个名为 ClassA 的类(现在是单例)来管理内容。

因为它是一个单例,所以我使用这种行为在许多需要它的类中获取这个唯一实例。

但是现在,我不能再把这个类作为一个单例了,我需要一个 NSDocument 的实例。

所以我在我的 NSDocument 子类上创建了 ClassA 的一个实例,但问题是在需要它的类上传递这个对象。

我有这种结构:

Class1 ClassA

我需要访问 Class1 中 Document 的 ClassA 实例。

我可以使用依赖注入通过 init 或 setter 方法在 Class1 中传递 ClassA,但由于 Document 无法直接访问 Class1,我需要将其传递给 Class3,然后是 Class2,然后是 Class1。

这是唯一的方法吗?还是有其他更好的处理方法?

【问题讨论】:

    标签: objective-c oop design-patterns


    【解决方案1】:

    我想说回到你的单例原则,但使用NSDocument作为ClassA对象字典的键;类似:

    static NSMutableDictionary *_classCache = [[NSMutableDictionary alloc] init];
    
    + (ClassA *)classAForDocument:(NSDocument *)document
    {
        ClassA *classA = [_classCache objectForKey:document];
        if (classA == nil)
        {
           // Initialise with something specific to the document I guess...
            classA = [[ClassA alloc] init];
            [_classCache setObject:classA forKey:document];
        }
        return classA;
    }
    

    这仅需要Class{1,2,3} 知道他们所属的文档。

    【讨论】:

    • 是的,但现在的问题是如何在我的 Class1 中检索当前的 NSDocument ?我不能使用 [[NSDocumentController sharedDocumentController] currentDocument] 因为它在拖动操作中不起作用,我需要它。这是我以前用过的。如果我需要将文档传递给我的 Class{1,2,3},这与直接传递 ClassA 相同。
    • @Johnmph 是的,这在我的回答中已注明。归根结底,如果您想使用这种类型的方法而不是您在问题中提到的级联 initWith... 方法,这些对象将不得不知道它们与应用程序的其余部分的关系。
    • 谢谢,所以没有单例或依赖注入就没有神奇的方法;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-05
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 2017-08-09
    • 1970-01-01
    相关资源
    最近更新 更多