PHP开发PHP经验分享

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

2020-10-07  本文已影响0人  phpworkerman
定义

解释器模式(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。

上一篇下一篇

猜你喜欢

热点阅读