目录
一、解释器模式
解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表达来解释这个语言(行为型)。
解释器模式的角色:
- 抽象表达式:声明了抽象的操作,是所有终结符表达式和非终结符表达式的公共父类;
- 终结符表达式:实现了与文法中的终结相关的解释操作,句子中的每一个终结符都是该类的实例;
- 非终结符表达式:实现了文法中非终结相关的解释操作;
- 环境类:存储解释器外的一些信息。
二、实现
在src目录下,新建一个interpreter文件夹,在该文件夹下新建一个interpreter.cj文件和interpreter.drawio文件。
类图
核心代码
package DesignPattern.interpreter
import std.collection.*
// 抽象表达式
abstract class AbstractNode {
public func interpret(): String
}
// 方向结点类
class DirectionNode <: AbstractNode {
public DirectionNode(private let direction: String) {}
public override func interpret() {
if (direction == "👈") {
return "向左"
} else if (direction == "👉") {
return "向右"
} else if (direction == "👆") {
return "向上"
} else if (direction == "👇") {
return "向下"
} else {
return "非法指令"
}
}
}
// 指令处理类
public class Handler {
public func out(datas: Array<String>) {
let words = ArrayList<DirectionNode>()
for (data in datas) {
words.append(DirectionNode(data))
}
for (word in words) {
print(word.interpret())
}
}
}
测试代码
package DesignPattern
import DesignPattern.interpreter.*
main(): Int64 {
let handler = Handler()
handler.out("👈")
return 0
}
三、优缺点
优点:
- 可以通过继承,易于改变和扩展文法;
- 新增解释表达式比较方便,只需要对应增加一个新的终结符表达式或非终结符表达式类,符合开闭原则。
缺点:
- 对于复杂文法难以维护,如果一个语言包含的文法规则太多,类的个数会极具上升;
- 执行效率低,由于大量使用循环和递归操作,在解释复杂句子时速度很慢。
四、适用环境
- 一些重复出现的问题可以用一个简单的语言进行描述;
- 一些语言的文法比较简单;
- 可以将一个需要解释的语言中的句子表示为一棵抽象语法树。
五、小结
本章为大家详细的介绍了仓颉设计模式中解释器模式的内容,下一章,为大家带来解释器模式练习题的内容。最后,创作不易,如果大家觉得我的文章对学习仓颉设计模式有帮助的话,就动动小手,点个免费的赞吧!收到的赞越多,我的创作动力也会越大哦,谢谢大家🌹🌹🌹!!!