解释器模式(Interpreter Pattern)

解释器模式

说明

解释器模式(Interpreter Pattern)属于行为型模式,是指给定一门语言,定义它的语法(文法)的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。是一种按照规定的语法(文法)对语言进行解析的模式。

我们平时开发用的编译器,就是一种解释器的实现,通过规定好的编程语法,通过解析后转换成机器码,才能让计算机执行。某些领域也有其规范的语法,比如乐谱、莫斯码等等。解释器模式在开发中几乎不会用到,除非需要创建一门新的语言。

结构

解释器模式主要角色如下:

抽象表达式(Expression):定义解释语法的接口;

终结符表达式(TerminalExpression):实现Expression定义的解释方法。终结符表达式可以理解为语法中需要被操作的对象,比如1 + 2,1跟2都是终结符表达式;

非终结符表达式(NonterminalExpression):实现Expression定义的解释方法。非终结符表达式可以理解为语法中的运算符或者关键字,根据需求有不同的实现;

上下文环境类(Context):包含解释器之外的信息与逻辑,负责根据语法调用不同的解释器等功能。

代码案例

抽象表达式(Expression)

java 复制代码
/**
 * @program: interpreter
 * @description: 抽象表达式接口
 * @author: wxw
 * @create: 2024-03-13 18:33
 **/
public interface IExpression {

    String interpret();
}

非终结符表达式(NonterminalExpression)

java 复制代码
/**
 * @program: interpreter
 * @description: 处理字符串表达式
 *              非终结符表达式(NonterminalExpression)
 * @author: wxw
 * @create: 2024-03-13 18:36
 **/
public abstract class ProcessingExpression implements IExpression {
    protected IExpression str;

    public ProcessingExpression(IExpression str) {
        this.str = str;
    }
}

/**
 * @program: interpreter
 * @description: 转换大写-处理字符串表达式
 *              非终结符表达式(NonterminalExpression)
 * @author: wxw
 * @create: 2024-03-13 18:44
 **/
public class UppercaseExpression extends ProcessingExpression {
    public UppercaseExpression(IExpression str) {
        super(str);
    }

    @Override
    public String interpret() {
        return str.interpret().toUpperCase();
    }
}

/**
 * @program: interpreter
 * @description: 转换小写-处理字符串表达式
 *              非终结符表达式(NonterminalExpression)
 * @author: wxw
 * @create: 2024-03-13 18:44
 **/
public class LowercaseExpression extends ProcessingExpression {
    public LowercaseExpression(IExpression str) {
        super(str);
    }

    @Override
    public String interpret() {
        return str.interpret().toLowerCase();
    }
}

/**
 * @program: interpreter
 * @description: 转换成char数组-处理字符串表达式
 *              非终结符表达式(NonterminalExpression)
 * @author: wxw
 * @create: 2024-03-13 18:44
 **/
public class CharsExpression extends ProcessingExpression {
    public CharsExpression(IExpression str) {
        super(str);
    }

    @Override
    public String interpret() {
        return Arrays.toString(str.interpret().toCharArray());
    }
}

终结符表达式(TerminalExpression)

java 复制代码
/**
 * @program: interpreter
 * @description: 字符串终结表达式
 *              终结符表达式(TerminalExpression)
 * @author: wxw
 * @create: 2024-03-13 18:35
 **/
public class StringExpression implements IExpression {

    private String str;

    public StringExpression(String str) {
        this.str = str;
    }

    @Override
    public String interpret() {
        return this.str;
    }
}

上下文环境类

java 复制代码
/**
 * @program: interpreter
 * @description: 上下文环境类
 * @author: wxw
 * @create: 2024-03-13 18:38
 **/
public class StringContext {

    private String str;

    public StringContext(String str) {
        this.str = str;
    }

    public String handleStr(){
        String[] strs = str.split(" ");
        String key = strs[0];
        IExpression str = new StringExpression(strs[1]);

        switch (key){
            case "uppercase":
                return new UppercaseExpression(str).interpret();
            case "lowercase":
                return new LowercaseExpression(str).interpret();
            case "chars":
                return new CharsExpression(str).interpret();
            default:
                return "输入错误!!!";
        }
    }
}

客户端

java 复制代码
public class Test {
    public static void main(String[] args) {
        String str1 = "uppercase hello!!!";
        String str2 = "lowercase Hello!!!";
        String str3 = "chars hello!!!";

        StringContext stringContext1 = new StringContext(str1);
        System.out.println(stringContext1.handleStr());

        StringContext stringContext2 = new StringContext(str2);
        System.out.println(stringContext2.handleStr());

        StringContext stringContext3 = new StringContext(str3);
        System.out.println(stringContext3.handleStr());
    }
}

输出结果

bash 复制代码
HELLO!!!
hello!!!
[h, e, l, l, o, !, !, !]
相关推荐
刷帅耍帅2 天前
设计模式-解释器模式
设计模式·解释器模式
coffee_baby7 天前
解释器模式原理剖析和Spring中的应用
java·spring boot·spring·解释器模式
仙魁XAN11 天前
Unity 设计模式 之 行为型模式 -【中介者模式】【迭代器模式】【解释器模式】
设计模式·迭代器模式·解释器模式·中介者模式
LB_bei12 天前
设计模式-行为型模式-解释器模式
设计模式·解释器模式
不是仙人的闲人1 个月前
C++ 设计模式——解释器模式
c++·设计模式·解释器模式
lianyinghhh1 个月前
Java设计模式【解释器模式】-行为型
java·设计模式·解释器模式
惜.己1 个月前
设计模式之解释器模式
java·开发语言·设计模式·解释器模式·intellij-idea·idea
臣妾写不来啊1 个月前
行为模式7.解释器模式------DSL语言
解释器模式
正在走向自律1 个月前
Java二十三种设计模式-解释器模式(23/23)
java·设计模式·解释器模式·行为型模式
咖啡+=方糖2 个月前
【重走编程路】设计模式概述(十二) -- 访问者模式、中介者模式、解释器模式
设计模式·解释器模式·访问者模式·中介者模式