看用TypeScript怎樣實現(xiàn)常見的設(shè)計模式,順便復(fù)習(xí)一下。
學(xué)模式最重要的不是記UML,而是知道什么模式可以解決什么樣的問題,在做項目時碰到問題可以想到用哪個模式可以解決,UML忘了可以查,思想記住就好。
這里盡量用原創(chuàng)的,實際中能碰到的例子來說明模式的特點(diǎn)和用處。

解釋器模式 Interpreter

特點(diǎn):使用給定語法來解釋一段內(nèi)容。

用處:管理類系統(tǒng)經(jīng)常會定義一些搜索語句格式來使用戶方便搜索庫里的內(nèi)容,這時就可以考慮用解釋器來翻譯執(zhí)行這些語句。

注意:適合相對簡單的語法。

解釋器模式通過把一段表達(dá)式拆開成很多個,分為不同的解析類,一個一個的去解析并執(zhí)行,這過程中經(jīng)常會用Context來保存解析過程的信息。
這種解釋器的優(yōu)點(diǎn)在于各種表達(dá)式的解析相對獨(dú)立,要加入新的規(guī)則也不會影響現(xiàn)有的解析。缺點(diǎn)也很明顯,一個表達(dá)式一個類,復(fù)雜語法或復(fù)合語法的話表達(dá)式數(shù)量就非常多,并且表達(dá)式之間也很難真正獨(dú)立。

下面用TypeScript寫一個簡單正則表達(dá)式的解釋器:
要解釋的表達(dá)式有:{}, [], \d, ^, $這幾種。

先建立一個Expression接口,所有解釋器都實現(xiàn)這個接口:

interface Expression{
    interpret(context: Context);
}

可以看到接口里用到了一個Context,這個用來保存解析時的一些數(shù)據(jù)和進(jìn)度,包含:
pattern: 整個表達(dá)式
currentPatternIndex: 當(dāng)前正在驗證的表達(dá)式的位置
lastExpression: 上一個表達(dá)式,用于{}解析
text: 需要驗證的文本
currentTextIndex: 當(dāng)前驗證到text里的哪個字符的位置
isMatch: 是否匹配成功

class Context{    constructor(public pattern: string, public text: string){

    }

    currentTextIndex: number = 0;    get currentText(): string{        return this.text[this.currentTextIndex];
    }

    currentPatternIndex: number = 0;
    lastExpression: string;    get&nbs