编程中的设计模式之解释器模式
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。