解釋器模式Interpreter 在iOS中的應(yīng)用

首先看下解釋器模式的定義:

定義一個(gè)語(yǔ)句,定義它的一個(gè)文法的一種表示鹿榜,并定義一個(gè)解釋器,這個(gè)解釋器使用改表示來(lái)解釋語(yǔ)言中的句子。

解釋器模式結(jié)構(gòu)圖:

Interpreter_UML_class_diagram.svg.png

名詞解釋:

Context:環(huán)境類驹溃,里面存放著需要解釋的中英文或者數(shù)據(jù)
AbstractExpression:抽象類,帶有Interpret函數(shù)
TerminalExpression(終結(jié)表達(dá)式):繼承于AbstractExpression的抽象類延曙,帶有Interpret函數(shù)豌鹤,終結(jié)表達(dá)式的意思是,組成句子的最小單位枝缔。
NonterminalExpression(非終結(jié)表達(dá)式):繼承于AbstractExpression的抽象類布疙,帶有Interpret函數(shù)。非終結(jié)表達(dá)式的意思是句子組成愿卸,可以包含多個(gè)終結(jié)表達(dá)式或者非終結(jié)表達(dá)式灵临。

代碼例子:

WeChatde6ac1f03bf320dc5b2f3a9a1aa256aa.png
import UIKit

class Context: NSObject {

    let dict = ["1":"January","2":"February","3":"March","4":"April","5":"May","6":"June","7":"July","8":"August","9":"September","10":"October","11":"November","12":"December"];
    
    func getObjectWithKey(key: String)-> String{
        
        return self.dict[key]!
    }
}
import UIKit

class AbstractExpression: NSObject {

    func interpretWithContext(context: Context)->String{
        return ""
    }
}

import UIKit

class MonthExpression: AbstractExpression {

    var month = ""
    
    init(month: String) {
        super.init()
        self.month = month;
    }
    
    override func interpretWithContext(context: Context) -> String {
        return "月份是\(context.getObjectWithKey(key: self.month))";
    }
}

import UIKit

class RangeExpression: AbstractExpression {

    var beginAbstract: AbstractExpression!
    var endAbstract: AbstractExpression!
    
    init(beginAbstract: AbstractExpression, endAbstract: AbstractExpression) {
        super.init()
        self.beginAbstract = beginAbstract
        self.endAbstract = endAbstract
    }
    
    override func interpretWithContext(context: Context) -> String {
        let begin = self.beginAbstract.interpretWithContext(context: context)
        let end = self.endAbstract.interpretWithContext(context: context)
        
        return "從\(begin)到\(end)";
    }
}
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        let context = Context()
        let jan = MonthExpression.init(month: "1")
        let nov = MonthExpression.init(month: "11")
        
        print("終結(jié)表達(dá)式:\(jan.interpretWithContext(context: context))")
        
        let monthRange = RangeExpression.init(beginAbstract: jan, endAbstract: nov)
        print("非終結(jié)表達(dá)式:\(monthRange.interpretWithContext(context: context))")
    }


}

6.png

其中Context和AbstractExpression對(duì)應(yīng)流程圖,MonthExpression對(duì)應(yīng)終結(jié)表達(dá)式趴荸,RangeExpression對(duì)應(yīng)非終結(jié)表達(dá)式

iOS應(yīng)用例子

        let timeInterval = TimeInterval.init(1632238928)
        let date = Date.init(timeIntervalSince1970: timeInterval)
                
        let dateformatter1 = DateFormatter()
        dateformatter1.dateFormat = "yyyy"
        
        let dateformatter2 = DateFormatter()
        dateformatter2.dateFormat = "yyyy年MM月dd日 HH:mm:ss"
        
        let time1 = dateformatter1.string(from: date)
        let time2 = dateformatter2.string(from: date)
        print(time1,time2)
WeChat8817799dd53d8c08e2db24e25629d655.png

DateFormatter是經(jīng)常用到的原生日期轉(zhuǎn)換工具俱诸。

思考:

1: 如果對(duì)終結(jié)表達(dá)式和非終結(jié)表達(dá)式有疑問(wèn)的,從代碼可以看出兩者的卻別赊舶,上面代碼的非終結(jié)表達(dá)式是由兩個(gè)終結(jié)表達(dá)式組成的睁搭,而終結(jié)表達(dá)式是一個(gè)句子最小單位。

2: 同理笼平,我們可以用終結(jié)表達(dá)式組成句子园骆,也可以反過(guò)來(lái),將句子按照Context規(guī)則拆分成各個(gè)表達(dá)式寓调,取出我們想要的結(jié)果锌唾。

3:iOS直接使用解釋器模式的時(shí)候不多,間接使用的不少,例如正則表達(dá)式晌涕,URL解析(url組成部分)滋捶,XML(由標(biāo)簽組成)語(yǔ)法解釋都應(yīng)用到了解釋器模式。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末余黎,一起剝皮案震驚了整個(gè)濱河市重窟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惧财,老刑警劉巖巡扇,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異垮衷,居然都是意外死亡厅翔,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門搀突,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)刀闷,“玉大人,你說(shuō)我怎么就攤上這事仰迁〉榛瑁” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵轩勘,是天一觀的道長(zhǎng)筒扒。 經(jīng)常有香客問(wèn)我怯邪,道長(zhǎng)绊寻,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任悬秉,我火速辦了婚禮澄步,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘和泌。我一直安慰自己村缸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布武氓。 她就那樣靜靜地躺著梯皿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪县恕。 梳的紋絲不亂的頭發(fā)上东羹,一...
    開(kāi)封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音忠烛,去河邊找鬼属提。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的冤议。 我是一名探鬼主播斟薇,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼恕酸!你這毒婦竟也來(lái)了堪滨?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤尸疆,失蹤者是張志新(化名)和其女友劉穎椿猎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體寿弱,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡犯眠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了症革。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片筐咧。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖噪矛,靈堂內(nèi)的尸體忽然破棺而出量蕊,到底是詐尸還是另有隱情,我是刑警寧澤艇挨,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布残炮,位于F島的核電站,受9級(jí)特大地震影響缩滨,放射性物質(zhì)發(fā)生泄漏势就。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一脉漏、第九天 我趴在偏房一處隱蔽的房頂上張望苞冯。 院中可真熱鬧,春花似錦侧巨、人聲如沸舅锄。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)皇忿。三九已至,卻和暖如春坦仍,著一層夾襖步出監(jiān)牢的瞬間鳍烁,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工桨踪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留老翘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像铺峭,于是被迫代替她去往敵國(guó)和親墓怀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容