1. 程式人生 > 實用技巧 >php 23種設計模式 - 直譯器模式

php 23種設計模式 - 直譯器模式

給定一個語言, 定義它的文法的一種表示,並定義一個直譯器,該直譯器使用該表示來解釋語言中的句子。
角色:
環境角色(PlayContent):定義解釋規則的全域性資訊。
抽象直譯器(Empress):定義了部分解釋具體實現,封裝了一些由具體直譯器實現的介面。
具體直譯器(MusicNote):實現抽象直譯器的介面,進行具體的解釋執行。

應用例項:編譯器、運算表示式計算。

優點:1、可擴充套件性比較好,靈活。 2、增加了新的解釋表示式的方式。 3、易於實現簡單文法。

缺點:1、可利用場景比較少。 2、對於複雜的文法比較難維護。 3、直譯器模式會引起類膨脹。 4、直譯器模式採用遞迴呼叫方法。

使用場景:

1、可以將一個需要解釋執行的語言中的句子表示為一個抽象語法樹。 2、一些重複出現的問題可以用一種簡單的語言來進行表達。 3、一個簡單語法需要解釋的場景。

class Expression { //抽象表示
    function interpreter($str) { 
        return $str; 
    } 
} 

class ExpressionNum extends Expression { //表示數字
    function interpreter($str) { 
        switch($str) { 
            case "0": return "零"; 
            case "1": return "一"; 
            case "2": return "二"; 
            case "3": return "三"; 
            case "4": return "四"; 
            case "5": return "五"; 
            case "6": return "六"; 
            case "7": return "七"; 
            case "8": return "八"; 
            case "9": return "九"; 
        } 
    } 
} 

class ExpressionCharater extends Expression { //表示字元
    function interpreter($str) { 
        return strtoupper($str); 
    } 
} 

class Interpreter { //直譯器
    function execute($string) { 
        $expression = null; 
        for($i = 0;$i<strlen($string);$i++) { 
            $temp = $string[$i]; 
            switch(true) { 
                case is_numeric($temp): $expression = new ExpressionNum(); break; 
                default: $expression = new ExpressionCharater(); 
            } 
            echo $expression->interpreter($temp);
            echo "<br>"; 
        } 
    } 
} 

//client
$obj = new Interpreter(); 
$obj->execute("123s45abc"); 
/* 輸出:
一
二
三
S
四
五
A
B
C */

23種模式總覽 :https://www.cnblogs.com/houss/p/11121584.html