2010-07-30 17 views
0

設置:我有一個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)完全放棄代表的想法,並改用通知。經理只會產生通知,蘋果和橙子會聽這些。儘管如此,這會失去大量的編譯時間檢查,這就是爲什麼我仍然在考慮那些耦合度更緊密的代表。

您在這裏推薦哪三種?或者可能有些不同?

回答

1

在某些情況下,責任鏈模式很有用。每個代表能夠確定它是否可以完成任務。所以它只是

 if (! apple.doItIfYouCan(condition, methodName)) 
     else (orange.doItIfYouCan(condition, methodName) 

我很少覺得這種責任擴散到代表們感到舒服。

因此,我通常會尋找類似於您的選項2的東西。實際上,您正在構建一個調度表。它儘可能地嘗試將條件改寫成可以在表格中查找的東西。所以實際上我們採取了一些資料,並取回對象和方法

 whatToDo = lookup(condition definition) 

     whatToDo[who].what 

(爲缺乏語法的道歉,我不說你的語言,我希望的概念轉化 - 我可以做這在JavaScript中,或者與函數指針在C中,或反射在Java中。)

+0

謝謝。這個lookup/dispatch表是我想到的。我爲什麼猶豫不決實現這一點的唯一原因是Objective-C對於代理應該如何在其消失後釋放它的「子代」有明確的規則,而且我不太清楚在查找表中這是如何工作的情況。 (我知道你說過你不會說那種語言,我希望也許別人能聽到。) – Jaanus 2010-07-30 07:53:53

相關問題