首先看下解釋器模式的定義:
定義一個(gè)語(yǔ)句,定義它的一個(gè)文法的一種表示鹿榜,并定義一個(gè)解釋器,這個(gè)解釋器使用改表示來(lái)解釋語(yǔ)言中的句子。
解釋器模式結(jié)構(gòu)圖:
名詞解釋:
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á)式灵临。
代碼例子:
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))")
}
}
其中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)
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)用到了解釋器模式。