美文网首页PHP开发PHP经验分享
编程中的设计模式之解释器模式

编程中的设计模式之解释器模式

作者: phpworkerman | 来源:发表于2020-10-07 17:20 被阅读0次
    定义

    解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。

    代码示例

    有女朋友的同志应该理解,女人有时候就爱说个反话,如果没有听出来弦外之音,有时候会引来天雷渡劫,假如有个女朋友话语翻译器,能准确的识别女朋友的话的意思,绝对是有用的小工具。现有一个demo,我们将对男朋友称谓和日常用于进行解释,还原语句原本意思。
    首先定义抽象表达式 AbstractExpression ,声明一个抽象的解释操作,表达式实现接口的方式总体分为两类,终结符表达式非终结符表达式。至于终结符和非终结符这两个概念出自编译原理,对于不熟悉编译原理的可以简单理解为,终结符代表要编译的字符是最小语义单位不可再编译,非终结符代表要编译的字符还存在可编译的空间。该例中只应用了终结符表达式,语句中的字就是最小单元。

    <?php
    abstract class AbstractExpression
    {
        public abstract function interpret($context);
    }
    
    class TitleExpression extends AbstractExpression
    {
        public function interpret($context)
        {
            if(empty($context)){
                return false;
            }
    
            switch($context){
                case '亲爱的':
                case '狗子':
                case '呆瓜':
                    $title = '男朋友';
                    break;
                default:
                    $title = '路人甲';
            }
    
            return $title;
        }
    }
    
    class DailyTalkExpression extends AbstractExpression
    {
        public function interpret($context)
        {
            if(empty($context)){
                return false;
            }
    
            switch($context){
                case '我不生气':
                    $lang = '我很生气';
                    break;
                case '我好无聊啊':
                    $lang = '有时间,求约';
                    break;
                case '我不饿':
                    $lang = '我就吃一口';
                    break;
                default:
                    $lang = '听力考试0分';
            }
    
            return $lang;
        }
    }
    
    class DemoPattern
    {
        public function handle()
        {
            $statement = '狗子,我好无聊啊';
            $statement = explode(',',$statement);
            $titleModel = new TitleExpression();
            $title = $titleModel->interpret($statement[0]);
    
            $dailyTalk = new DailyTalkExpression();
            $daily = $dailyTalk->interpret($statement[1]);
    
            echo $title . $daily;
        }
    }
    
    $demoPattern = new DemoPattern();
    $demoPattern->handle();
    
    总结

    该例子只是解释器很微小的还原与说明,应用解释器的使用场景要足够高时才会使用,该模式易于扩展文法规则,但对于复杂的文法会造成类的数量增多难以管理和维护,可以通过语法分析程序或编译器生成器来处理,例如PHP Parser。

    相关文章

      网友评论

        本文标题:编程中的设计模式之解释器模式

        本文链接:https://www.haomeiwen.com/subject/sonfpktx.html