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

2018-12-20  本文已影响2人  骑着母猪砍大象

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

运行平台: Windows

php版本: php7.0

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


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

角色:

<?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

上一篇 下一篇

猜你喜欢

热点阅读