跟我一起学“仓颉”设计模式-解释器模式

目录

一、解释器模式

二、实现

三、优缺点

四、适用环境

五、小结


一、解释器模式

解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表达来解释这个语言(行为型)。

解释器模式的角色:

  • 抽象表达式:声明了抽象的操作,是所有终结符表达式和非终结符表达式的公共父类;
  • 终结符表达式:实现了与文法中的终结相关的解释操作,句子中的每一个终结符都是该类的实例;
  • 非终结符表达式:实现了文法中非终结相关的解释操作;
  • 环境类:存储解释器外的一些信息。

二、实现

在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
}

三、优缺点

优点:

  • 可以通过继承,易于改变和扩展文法;
  • 新增解释表达式比较方便,只需要对应增加一个新的终结符表达式或非终结符表达式类,符合开闭原则。

缺点:

  • 对于复杂文法难以维护,如果一个语言包含的文法规则太多,类的个数会极具上升;
  • 执行效率低,由于大量使用循环和递归操作,在解释复杂句子时速度很慢。

四、适用环境

  • 一些重复出现的问题可以用一个简单的语言进行描述;
  • 一些语言的文法比较简单;
  • 可以将一个需要解释的语言中的句子表示为一棵抽象语法树。

五、小结

本章为大家详细的介绍了仓颉设计模式中解释器模式的内容,下一章,为大家带来解释器模式练习题的内容。最后,创作不易,如果大家觉得我的文章对学习仓颉设计模式有帮助的话,就动动小手,点个免费的赞吧!收到的赞越多,我的创作动力也会越大哦,谢谢大家🌹🌹🌹!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学徒钝子生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值