Java 设计模式之解释器模式

文章目录

Java 设计模式之解释器模式

概述

  • 解释器模式(interpreter):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
  • 如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。

UML

  • AbstractExpression:表达式接口,定义解释行为。
  • TerminalExpression:终结符表达式,直接返回一个值。
  • NonterminalExpression:非终结符表达式,包含其他表达式并组合它们。
  • Context:上下文环境类。

代码实现

定义解释器接口:

java 复制代码
public interface Expression {
    int interpret();
}

定义终端解释器类:

java 复制代码
public class NumberExpression implements Expression {
    private int number;

    public NumberExpression(int number) {
        this.number = number;
    }

    @Override
    public int interpret() {
        return number;
    }
}

定义非终端解释器类:

java 复制代码
// 加法表达式
public class AddExpression implements Expression {
    private Expression leftExpression;
    private Expression rightExpression;

    public AddExpression(Expression leftExpression, Expression rightExpression) {
        this.leftExpression = leftExpression;
        this.rightExpression = rightExpression;
    }

    @Override
    public int interpret() {
        return leftExpression.interpret() + rightExpression.interpret();
    }
}
java 复制代码
// 减法表达式
public class SubtractExpression implements Expression {
    private Expression leftExpression;
    private Expression rightExpression;

    public SubtractExpression(Expression leftExpression, Expression rightExpression) {
        this.leftExpression = leftExpression;
        this.rightExpression = rightExpression;
    }

    @Override
    public int interpret() {
        return leftExpression.interpret() - rightExpression.interpret();
    }
}

使用:

java 复制代码
public class Client {
    public static void main(String[] args) {
        NumberExpression numberExpression1 = new NumberExpression(1);
        NumberExpression numberExpression2 = new NumberExpression(2);
        NumberExpression numberExpression3 = new NumberExpression(5);
        Expression addExpression = new AddExpression(numberExpression1, numberExpression2);
        Expression subtractExpression = new SubtractExpression(addExpression, numberExpression3);
        int result = subtractExpression.interpret();
        System.out.println("result: " + result);
    }
}

输出:

复制代码
result: -2
相关推荐
wszy18095 分钟前
顶部标题栏的设计与实现:让用户知道自己在哪
java·python·react native·harmonyos
程序员小假1 小时前
我们来说一下无锁队列 Disruptor 的原理
java·后端
资生算法程序员_畅想家_剑魔1 小时前
Kotlin常见技术分享-02-相对于Java 的核心优势-协程
java·开发语言·kotlin
ProgramHan1 小时前
Spring Boot 3.2 新特性:虚拟线程的落地实践
java·jvm·spring boot
nbsaas-boot2 小时前
Go vs Java 的三阶段切换路线图
java·开发语言·golang
毕设源码-钟学长2 小时前
【开题答辩全过程】以 基于Java的慕课点评网站为例,包含答辩的问题和答案
java·开发语言
小北方城市网2 小时前
分布式锁实战指南:从选型到落地,避开 90% 的坑
java·数据库·redis·分布式·python·缓存
深圳佛手2 小时前
使用java,怎么样高效地读取一个大文件(10g以上)?
java·开发语言
sheji34162 小时前
【开题答辩全过程】以 景点移动导游系统的设计与实现为例,包含答辩的问题和答案
java
毕设源码-赖学姐2 小时前
【开题答辩全过程】以 高校失物招领信息管理系统的设计与开发为例,包含答辩的问题和答案
java