美文网首页
设计模式(二十):解释器模式

设计模式(二十):解释器模式

作者: 骑着母猪砍大象 | 来源:发表于2018-12-20 20:52 被阅读2次

转载请注明作者和出处https://www.jianshu.com/p/6b0bb7a753d1(https://www.jianshu.com/p/6b0bb7a753d1)

运行平台: Windows

php版本: php7.0

作者简介: 一个本该成为游戏职业选手却被编程耽误的程序员


定义一个语言的文法,并且建立一个解释器来解释该语言中的句子,这里的“语言”是指使用规定格式和语法的代码。解释器模式是一种类行为型模式。

角色:

  • 环境角色(PlayContent):定义解释规则的全局信息。
  • 抽象解释器(Empress):定义了部分解释具体实现,封装了一些由具体解释器实现的接口。
  • 具体解释器(MusicNote):实现抽象解释器的接口,进行具体的解释执行。
<?php
header("Content-type:text/html;Charset=utf-8");

//环境角色,定义要解释的全局内容
class Expression{
    public $content;
    function getContent(){
        return $this->content;
    }
}

//抽象解释器
abstract class AbstractInterpreter{
    abstract function interpret($content);
}

//具体解释器,实现抽象解释器的抽象方法
class ChineseInterpreter extends AbstractInterpreter{
    function interpret($content){
        for($i=1;$i<count($content);$i++){
            switch($content[$i]){
                case '0': echo "零<br>";break;
                case "1": echo "一<br>";break;
                case "2": echo "二<br>";break;
                case "3": echo "三<br>";break;
                case "4": echo "四<br>";break;
                case "5": echo "五<br>";break;
                case "6": echo "六<br>";break;
                case "7": echo "七<br>";break;
                case "8": echo "八<br>";break;
                case "9": echo "九<br>";break;
                default:echo "其他";
            }
        }
    }
}
class EnglishInterpreter extends AbstractInterpreter{
    function interpret($content){
        for($i=1;$i<count($content);$i++){
            switch($content[$i]){
                case '0': echo "zero<br>";break;
                case "1": echo "one<br>";break;
                case "2": echo "two<br>";break;
                case "3": echo "three<br>";break;
                case "4": echo "four<br>";break;
                case "5": echo "five<br>";break;
                case "6": echo "six<br>";break;
                case "7": echo "seven<br>";break;
                case "8": echo "eight<br>";break;
                case "9": echo "nine<br>";break;
                default:echo "others";
            }
        }
    }
}

//封装好的对具体解释器的调用类,非解释器模式必须的角色
class Interpreter{
    private $interpreter;
    private $content;
    function __construct($expression){
        $this->content = $expression->getContent();
        if($this->content[0] == "Chinese"){
            $this->interpreter = new ChineseInterpreter();
        }else{
            $this->interpreter = new EnglishInterpreter();
        }
    }
    function execute(){
        $this->interpreter->interpret($this->content);
    }
}

//测试
$expression = new Expression();
$expression->content = array("Chinese",3,2,4,4,5);
$interpreter = new Interpreter($expression);
$interpreter->execute();

$expression = new Expression();
$expression->content = array("English",1,2,3,0,0);
$interpreter = new Interpreter($expression);
$interpreter->execute();
//结果:
//三
//二
//四
//四
//五
//one
//two
//three
//zero
//zero

相关文章

网友评论

      本文标题:设计模式(二十):解释器模式

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