白话-23种设计模式20-解释器模式

举报
object 发表于 2022/07/13 15:54:12 2022/07/13
1.3k+ 0 0
【摘要】 一、白话  解释器模式,就是定义一种语言,并提供一个解释器。定义的语句都可以被解释器解释。例如数学中,我们定义 数字,定义了加法,数字和加法组合成一个语言公式解释器,1+1=2,这样,主要是数字和加法的组合语言,我都能用加法公式解释器解释。我现在定义一个 名词,使用包含来解释。在此基础上,又定义一个组合名词,使用并且并且来解释。二、定义  给定一个语言,定义它的文法表示,并定义一个解释器,这...

一、白话

  解释器模式,就是定义一种语言,并提供一个解释器。定义的语句都可以被解释器解释。例如数学中,我们定义 数字,定义了加法,数字和加法组合成一个语言公式解释器,1+1=2,这样,主要是数字和加法的组合语言,我都能用加法公式解释器解释。我现在定义一个 名词,使用包含来解释。在此基础上,又定义一个组合名词,使用并且并且来解释。

二、定义

  给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。

抽象表达式(Abstract Expression)角色:定义解释器的接口,约定解释器的解释操作,主要包含解释方法 interpret()。
终结符表达式(Terminal Expression)角色:是抽象表达式的子类,用来实现文法中与终结符相关的操作,文法中的每一个终结符都有一个具体终结表达式与之相对应。
非终结符表达式(Nonterminal Expression)角色:也是抽象表达式的子类,用来实现文法中与非终结符相关的操作,文法中的每条规则都对应于一个非终结符表达式。
环境(Context)角色:通常包含各个解释器需要的数据或是公共的功能,一般用来传递被所有解释器共享的数据,后面的解释器可以从这里获取这些值。

三、示例

// 抽象表达式-定义解释器
public interface Expression {
    public boolean interpret(String data);
}
// 终结符表达式
public class TerminalExpression implements Expression {
    private String data;

    public TerminalExpression(String data) {
        this.data = data;
    }

    @Override
    public boolean interpret(String msg) {
        return msg.contains(data);
    }
}
// 非总结符表达式
public class AndExpression implements Expression {
    Expression expr1;
    Expression expr2;

    public AndExpression(Expression expr1, Expression expr2) {
        this.expr1 = expr1;
        this.expr2 = expr2;
    }

    @Override
    public boolean interpret(String data) {
        return expr1.interpret(data) && expr2.interpret(data);
    }
}
// 非总结符表达式
public class OrExpression implements Expression {
    Expression expr1;
    Expression expr2;

    public OrExpression(Expression expr1, Expression expr2) {
        this.expr1 = expr1;
        this.expr2 = expr2;
    }

    @Override
    public boolean interpret(String data) {
        return expr1.interpret(data) || expr2.interpret(data);
    }
}
// 环境角色
public class Context {
    // 定义 是否包含苹果或者香蕉
    public static Expression hasAppleExpression() {
        Expression apple = new TerminalExpression("apple");
        Expression banana = new TerminalExpression("banana");
        return new OrExpression(apple, banana);
    }

    // 定义 是否是红色苹果
    public static Expression isRedAppleExpression() {
        Expression apple = new TerminalExpression("apple");
        Expression red = new TerminalExpression("red");
        return new AndExpression(apple, red);
    }
}
public class InterpreterApplication {
    // 客户端使用
    public static void main(String[] args) {
        Expression hasAppleExpression = Context.hasAppleExpression();
        Expression redAppleExpression = Context.isRedAppleExpression();

        System.out.println("has apple ? " + hasAppleExpression.interpret("apple"));
        System.out.println("is red apple ? " + redAppleExpression.interpret("red apple"));

        System.out.println("has apple ? " + hasAppleExpression.interpret("pear"));
        System.out.println("is red apple ? " + redAppleExpression.interpret("blue apple"));
    }
}

  输出结果示例:

   has apple ? true
   is red apple ? true
   has apple ? false
   is red apple ? false

四、总结

  特点: 1、可扩展性比较好,灵活。 2、增加了新的解释表达式的方式。 3、易于实现简单文法。 4、对于复杂的文法比较难维护。 5、解释器模式会引起类膨胀。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。