如何優(yōu)雅地實現(xiàn)策略模式

在 XMind iOS 版開發(fā)過程中, 需要對不同的布局方式選擇不同的類來進行布局,所以需要用到策略模式來處理。在開發(fā)過程中湾宙,找到了一種還不錯的解決方式。

在 XMind 思維導圖中,每一個 topic 都包含一個布局的名稱侠鳄,被稱為 structure埠啃,我們?yōu)楦鞣N布局設計了不同的布局類來布局,這里稱為 layout伟恶。

最初的處理方法

最開始開發(fā)的過程中碴开,我在 controller 中定義了一個 NSDictionary,用于存放 structureNamelayout 的對應關系博秫。

@property (nonamatic, strong) NSDictionary *structureDict;

- (instance)init {
    self = [super init];
    _structureDict = @{ structureNameA : LayoutA,
                        structureNameB : LayoutB,
                        structureNameC : LayoutC,
                        structureNameD : LayoutD,
                        structureNameE : LayoutE};
}

這種方式的確可以避免太多的 if else 的選擇結構潦牛。但是, controller還是必須要知道各個策略類挡育,假如 structureName 有變化巴碗,或者新增一種策略 (layout class) 的時候,需要去修改 controller 的策略 structureDict静盅,并且需要導入新的策略類良价。

解耦的處理方法

后來經 @Frank 提醒,找到了一種更好的方式來處理此類策略選擇問題蒿叠。每個策略子類自行將自己以及對應的 strucutreName 作為 key 注冊到共同父類 LayoutBase class 中的字典中去明垢。這樣以來,策略有變化 (如 structureNameA 需要選擇策略 LayoutC ) 或者新增策略的話市咽,只需要繼續(xù)給 LayoutBase 加子類即可痊银,不需要需要其他類,實現(xiàn)了解耦合施绎。示例代碼如下溯革,

在父類中提供注冊和查詢的類方法。

@implementation LayoutBase

static NSMutableDictionary *subClassDict = nil;

+ (void)registerLayout:(Class)layout withKey:(NSString *)key {
    if (subClassDict == nil)
    {
        subClassDict = [[NSMutableDictionary alloc] init];
    }
    [subClassDict setObject:layout forKey:key];
}

+ (Class)layoutClassWithKey:(NSString *)key {
    if ([subClassDict objectForKey:key]) {
        Class class = [subClassDict objectForKey:key];
        return class;
    }
    return nil;
}

@end

子類則需要在 load 的方法中谷醉,將自己注冊到 subClassDict 中致稀。

@implementation LayoutA

+ (void)load {
    [LayoutBase registerLayout:self withKey:structureNameA];
}

@end

什么是 load 方法?

上述處理方法中我們用到了類的 load 方法俱尼。load 方法是一個特殊類方法抖单。
runtime 會在程序運行一開始對所有引用的 class 調用其 load 方法一次。所以可以利用這個方法進行一些預處理工作遇八。官方的介紹矛绘,

Invoked whenever a class or category is added to the Objective-C runtime; implement this method to perform class-specific behavior upon loading.

詳情請移步:Apple 官方介紹

還可參考:Ider的博客 Objective C類方法load和initialize的區(qū)別

進一步優(yōu)化

一般情況下,策略選擇不會是 key 和 class 一一對應著么簡單刃永』醢可能還要考慮各種因素加入算法進行策略選擇。把策略選擇這個職責交給一個單獨的類來處理斯够,我們這里把它叫做 layoutSelector囚玫。Controller 在選擇策略時喧锦,發(fā)消息給 layoutSelector,然后由 layoutSelector 進行處理將選好的策略返回劫灶。

Layout *layout = [controller installLayoutWithConditions: (NSDictionary *)conditionsDict];

歡迎來我的個站逛逛: http://alexyu.me/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末裸违,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子本昏,更是在濱河造成了極大的恐慌,老刑警劉巖枪汪,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涌穆,死亡現(xiàn)場離奇詭異,居然都是意外死亡雀久,警方通過查閱死者的電腦和手機宿稀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赖捌,“玉大人祝沸,你說我怎么就攤上這事≡奖樱” “怎么了罩锐?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長卤唉。 經常有香客問我涩惑,道長,這世上最難降的妖魔是什么桑驱? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任竭恬,我火速辦了婚禮,結果婚禮上熬的,老公的妹妹穿的比我還像新娘痊硕。我一直安慰自己,他們只是感情好押框,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布岔绸。 她就那樣靜靜地躺著,像睡著了一般强戴。 火紅的嫁衣襯著肌膚如雪亭螟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天骑歹,我揣著相機與錄音预烙,去河邊找鬼。 笑死道媚,一個胖子當著我的面吹牛扁掸,可吹牛的內容都是我干的翘县。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼谴分,長吁一口氣:“原來是場噩夢啊……” “哼锈麸!你這毒婦竟也來了?” 一聲冷哼從身側響起牺蹄,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤忘伞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后沙兰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體氓奈,經...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年鼎天,在試婚紗的時候發(fā)現(xiàn)自己被綠了舀奶。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡斋射,死狀恐怖育勺,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情罗岖,我是刑警寧澤涧至,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站呀闻,受9級特大地震影響化借,放射性物質發(fā)生泄漏。R本人自食惡果不足惜捡多,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一蓖康、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧垒手,春花似錦蒜焊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至榜掌,卻和暖如春优妙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背憎账。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工套硼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人胞皱。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓邪意,卻偏偏與公主長得像九妈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子雾鬼,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內容