設置:我有一個singleton數據訪問管理器對象,稱之爲Manager。我也有一些視圖控制器,稱它們爲蘋果和橘子。 Apples和Orange都使用Manager來實現一些共享數據模型/訪問功能。如何讓一個對象有多個委託而不需要給對象太多的領域知識?
我想經理根據這樣的事情在某些情況下,回給他們打電話之一:
if (someCondition)
[self.applesDelegate callSomething];
else if (otherCondition)
[self.orangesDelegate callSomething];
我看到實現這個,沒有一個我很高興的三種方式。
1)完全按照上面所做的那樣,給經理一些屬性,如applesDelegate和orangesDelegate,並讓相關的視圖控制器爲自己註冊。但是這樣做會很糟糕,因爲經理會擁有領域知識,我不想那麼做。經理不應該知道任何有關Apple或Orange物品的信息。
2)有一個動態代表地圖。經理將有一定的NSMutableDictionary爲代表,與蘋果和桔子會做類似
[manager.delegateMap setObject:self forKey:@"applesDelegate"];
和管理者,當它需要調用的代表,會做這樣的事情
if (someCondition) {
[[delegatemap objectForKey:@"applesDelegate"] callSomeMethod];
}
這聽起來可行的,但奇怪。而且我不確定它如何與常見的dealloc要求一樣,在沒有委託屬性的情況下將委託設置爲零,但這種間接。
3)完全放棄代表的想法,並改用通知。經理只會產生通知,蘋果和橙子會聽這些。儘管如此,這會失去大量的編譯時間檢查,這就是爲什麼我仍然在考慮那些耦合度更緊密的代表。
您在這裏推薦哪三種?或者可能有些不同?
謝謝。這個lookup/dispatch表是我想到的。我爲什麼猶豫不決實現這一點的唯一原因是Objective-C對於代理應該如何在其消失後釋放它的「子代」有明確的規則,而且我不太清楚在查找表中這是如何工作的情況。 (我知道你說過你不會說那種語言,我希望也許別人能聽到。) – Jaanus 2010-07-30 07:53:53