本篇文章主要講三個(gè)點(diǎn):?
? ? 1. 什么是策略模式.
? ? 2. 策略模式的優(yōu)缺點(diǎn).
? ? 3. demo .
1. 策略模式
? ? 定義一系列算法, 并且將每個(gè)算法封裝起來, 算法之間可以互相替換. 使用前提: 輸入已知, 好比你渴了, 可以喝可樂, 可以喝牛奶, 也可以喝水.?
在我們項(xiàng)目中比較常見的使用情況:?
????1. 切換主題, 要展示圖片, 只是展示的圖片不同而已.
????2. 更換顯示狀態(tài), 總用淘寶的人知道, 展示界面可以是一排一個(gè) cell, 也可以是一排兩個(gè) cell.?
放一張圖簡(jiǎn)單明了:
2. 策略模式的優(yōu)缺點(diǎn)
? ? 優(yōu)點(diǎn): 邏輯清晰, 代碼維護(hù)性強(qiáng)
? ? 缺點(diǎn): 代碼量會(huì)增大一些, 應(yīng)用場(chǎng)景局限
3. demo
????策略最重要的一點(diǎn)是策略類, 它是一個(gè)抽象類, 下面有幾個(gè)具體的實(shí)現(xiàn)類, 來實(shí)現(xiàn)抽象類中的抽放方法. Context 為場(chǎng)景類, 場(chǎng)景類聚合策略類就是策略模式啦, 下面用一個(gè) demo 來再說明一下:
????兩個(gè)輸入框, 兩個(gè)按鈕, 分別驗(yàn)證輸入的是否是純數(shù)字和純英文, 這里有一個(gè)策略類?InputTest, 具體實(shí)現(xiàn)類:?InputNumTest 和?InputEnglishTest, 場(chǎng)景類: 子類化的輸入框類 MRTextField, 再放一張 UML 圖來更為直觀:
? ? ? ps: 繼承和實(shí)現(xiàn)接口類似, 所以這里直接用的繼承.
? ? ? 抽象類 InputTest 里面有個(gè)兩個(gè)方法和一個(gè)屬性,??testInputWithTextField: 用于驗(yàn)證輸入,?testRegexWithRegix:andText: 用于檢測(cè)正則, desc 為檢測(cè)錯(cuò)誤時(shí)的字段描述.
? ? InputEnglishTest 里面寫的和 InputNumTest 一樣, 只是正則不同, 就直放上 InputNumTest 的截圖啦, InputNumTest 繼承自 InputTest 類, 實(shí)現(xiàn)其抽象方法, 根據(jù)傳入的 tf 驗(yàn)證輸入是否正確.
? ? ? 子類化的輸入框類, 聚合了策略類 InputTest, checkInput 用于檢測(cè)輸入是否正確, desc 為檢測(cè)錯(cuò)誤時(shí)的描述, .m 文件實(shí)現(xiàn)了 checkInput 方法, 用 self.iputTest 檢測(cè)輸入是否正確.
? ? ? ViewController.m 里實(shí)現(xiàn)了具體代碼, 初始化策略類, 當(dāng)檢測(cè)的時(shí)候調(diào)用 [tf checkInput] 即可檢測(cè)輸入了.
? ? ? 這里是 demo的?傳送門, 如果喜歡的話, 大家可以為這篇文章點(diǎn)個(gè) ??, 加個(gè)關(guān)注呦!