解释器模式和php实现
解释器模式:
给定一个语言, 定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
角色:
环境角色:定义解释规则的全局信息。
抽象解释器::定义了部分解释具体实现,封装了一些由具体解释器实现的接口。
具体解释器(MusicNote):实现抽象解释器的接口,进行具体的解释执行。
UML图:
代码实现:
<?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 "This is nobody<br>";break;
case "1": echo "This is one people<br>";break;
case "2": echo "This is two people<br>";break;
case "3": echo "This is three people<br>";break;
case "4": echo "This is four people<br>";break;
case "5": echo "This is five people<br>";break;
case "6": echo "This is six people<br>";break;
case "7": echo "This is seven people<br>";break;
case "8": echo "This is eight people<br>";break;
case "9": echo "This is nine people<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();
//结果:
三个人
二个人
四个人
四个人
五个人
This is one people
This is two people
This is three people
This is nobody
This is nobody
?>
适用性:
当有一个语言需要解释执行, 并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式。而当存在以下情况时该模式效果最好:
该文法简单对于复杂的文法, 文法的类层次变得庞大而无法管理。此时语法分析程序生成器这样的工具是更好的选择。它们无需构建抽象语法树即可解释表达式, 这样可以节省空间而且还可能节省时间。
效率不是一个关键问题最高效的解释器通常不是通过直接解释语法分析树实现的, 而是首先将它们转换成另一种形式。例如,正则表达式通常被转换成状态机。但即使在这种情况下, 转换器仍可用解释器模式实现, 该模式仍是有用的。
解释器模式和php实现的更多相关文章
- interpreter(解释器模式)
一.引子 其实没有什么好的例子引入解释器模式,因为它描述了如何构成一个简单的语言解释器,主要应用在使用面向对象语言开发编译器中:在实际应用中,我们可能很少碰到去构造一个语言的文法的情况. 虽然你几乎用 ...
- php实现设计模式之 解释器模式
<?php /* * 解释器模式:给定一种语言,定义它文法的一种表示,并定义一个解释器,该解释器利用该表示来解释语言中的句子 * */ class Expression { function i ...
- [工作中的设计模式]解释器模式模式Interpreter
一.模式解析 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的句子. 以上是解释器模式的类图,事实上我 ...
- 解释器模式(Interpreter Pattern)
定义:给定一种语言,定义他的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中句子. 抽象解释器:声明一个所有具体表达式都要实现的抽象接口(或者抽象类),接口中主要是一个interpre ...
- C#设计模式——解释器模式(Interpreter Pattern)
一.概述 在软件开发特别是DSL开发中常常需要使用一些相对较复杂的业务语言,如果业务语言使用频率足够高,且使用普通的编程模式来实现会导致非常复杂的变化,那么就可以考虑使用解释器模式构建一个解释器对复杂 ...
- JAVA 设计模式 解释器模式
用途 解释器模式 (Interpreter) 定义一个语言,定义它的文法的一种表示. 并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 解释器模式是一种行为型模式. 结构
- 深入浅出设计模式——解释器模式(Interpreter Pattern)
模式动机 如果在系统中某一特定类型的问题发生的频率很高,此时可以考虑将这些问题的实例表述为一个语言中的句子,因此可以构建一个解释器,该解释器通过解释这些句子来解决这些问题.解释器模式描述了如何构成一个 ...
- JAVA设计模式之解释器模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述解释器(Interpreter)模式的: 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个 ...
- 【GOF23设计模式】解释器模式 & 访问者模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_解释器模式.访问者模式.数学表达式动态解析库式 1.解释器模式Interpreter 2.访问者模式Visitor
- Java设计模式-解释器模式(Interpreter)
解释器模式是我们暂时的最后一讲,一般主要应用在OOP开发中的编译器的开发中,所以适用面比较窄. Context类是一个上下文环境类,Plus和Minus分别是用来计算的实现,代码如下: public ...
随机推荐
- scala新人佑门
scala语言 1. val和var val和var当前区别在于前者只能被赋值一次,就像java中的final,但是后者则可以随意覆盖: 2. Unit Unit返回代表空返回,类似于vo 3. 类型 ...
- tyvj1659救援队——最小生成树
题目:http://www.joyoi.cn/problem/tyvj-1659 想清楚了是非常简单的最小生成树: 1.树中每条边都会被走两边: 2.每个点会走度数遍,起点又多走一遍: 根据以上两条处 ...
- CF-851B
B. Arpa and an exam about geometry time limit per test 2 seconds memory limit per test 256 megabytes ...
- java 原始类与封装类 的区别
int是java提供的8种原始数据类型之一.Java为每个原始类型提供了封装类,Integer是java为int提供的封装类.int的默认值为0,而Integer的默认值为null,即Integer可 ...
- 3.12-3.16 Hbase集成hive、sqoop、hue
一.Hbase集成hive https://cwiki.apache.org/confluence/display/Hive/HBaseIntegration 1.说明 Hive与HBase整合在一起 ...
- POJ - 1502 MPI Maelstrom 路径传输Dij+sscanf(字符串转数字)
MPI Maelstrom BIT has recently taken delivery of their new supercomputer, a 32 processor Apollo Odys ...
- Git 分支管理 不使用Fast forward模式进行合并 分支管理策略
通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息. 如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的comm ...
- STL——queue
1.初始化 需要头文件<queue> queue<int>que; 2.成员函数 C++队列Queue类成员函数如下: back()返回最后一个元素 empty()如果队列空则 ...
- ue4 tags 与 cast
父类设置tags,子类默认自动添加这个tags 子类可以强行删除父类的tags,这时如果把子类cast为父类,一样找不到这个tags 综上,要找到一个actor的tags,那么这个actor上就一定要 ...
- Solr 6.7学习笔记(08)-- Facet
在搜索中,我们搜索时,通常会自动返回一些相关的搜索.比如,你搜索了一本书,会自动返回作者信息加上他的其它书籍的数量.这种功能在Solr中称之为Facet.不太好翻译.下面对于参数的说明,我以搜索“手机 ...