设计模式-解释模式
作者:edwin
日期:2019-08-10 12:39:27
所属分类:后端 - php

这个模式中,给定一门语言,定义了其语法的表示以及一个解释器,该解释器会使用该表示来解释语言中的句子

NonTeminalExpression(非终端表达式)
This class maintains(维护) instance variables of type AbstractExpression for each symbol(符号) in a rule, and implements an Interpret operation for nonterminal(非终结) symbols in the grammar(语法). 
(这类为在一个规则的每个符号维护AbstractExpression类型的实例变量,实现了一个为语法中的非终结符号的解释操作。)

TeminalExpression(终端表达式)
This class implements an Interpret operation associated([ə'səuʃi,eitid] 相关的) with terminal symbols in the grammar. 
(这类实现一个与语法中的终端符号相关的解释操作。)

AbstractExpression(抽像表达式)
This class declares an abstract Interpret operation that is common to all nodes in the abstract syntax tree. 
(这类声明一个在所有抽象语法树中所有节点共享的一个抽象解释操作。)

Client(客户端)
This class (a) builds, or is given, an abstract syntax tree representing(代表) a particular([pə'tikjulə] 详细的) sentence in the language that the grammar defines, and (b) invokes the Interpret operation. 
(这类(a)构建,或者是被赋予了,一个抽象语法树代表一个语法定义语言中的特定句子,和(b)调用解释操作。)

Context(上下文)
This class contains information that's global to the interpreter. 
(这个类包含的信息的全局解释器。)

代码实现

<?php
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 Expression
{
    function interpreter($str)
    {
        return $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);
        }
    }
}

$obj = new Interpreter();
$obj->execute("12345abc");

评论

全部评论 / 0