解释器模式(Interpreter Pattern)
1.策略模式(Strategy Pattern)2.桥接模式(Bridge Pattern)3.代理模式(Proxy Pattern)4.中介者模式(Mediator Pattern)5.过滤器模式(Filter Pattern)6.适配器模式(Adapter Pattern)7.责任链模式(Chain Of Responsibility Pattern)8.装饰器模式(Decorator Pattern)9.建造者模式(Builder Pattern)10.观察者模式(Observer Pattern)11.工厂模式(Factory Pattern)12.单例模式(Singleton Pattern)13.组合模式(Composite Pattern)14.模板模式(Template Pattern)15.原型模式(Prototype Pattern)16.外观模式(Facade Pattern)17.享元模式(Flyweight Pattern)18.命令模式(Command Pattern)
19.解释器模式(Interpreter Pattern)
20.迭代器模式(Iterator Pattern)解释器模式(Interpreter Pattern)
一、定义
解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
二、优缺点
优点: 1、可扩展性比较好,灵活。 2、增加了新的解释表达式的方式。 3、易于实现简单文法。
缺点: 1、可利用场景比较少。 2、对于复杂的文法比较难维护。 3、解释器模式会引起类膨胀。 4、解释器模式采用递归调用方法。
三、具体实现
3.1 原型图

- AbstractExpression 抽象表达式:声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享。
- TerminalExpression 终结符表达式:实现于文法中的终结符相关联的解释操作;一个句子中的每个终结符需要该类的一个实例。
- NonterminalExpression 非终结符表达式:对文法中的每一条规则都需要一个NonterminalExpression类。
- Context 上下文:包含解释器之外的一一些全局信息。
- Client 客户:构建表示该文法定义的语言中一个特定的句子的抽象语法树。该抽象语法树由NonterminalExpression和TerminalExpression的实例装配而成。
3.2 实现
1、创建一个表达式接口
/**
* @author zhongtao
* @date 2023/5/31 10:31
*/
public interface Expression {
public boolean interpret(String context);
}
2、创建实现了上述接口的实体类
/**
* @author zhongtao
* @date 2023/5/31 10:34
*/
public class TerminalExpression implements Expression {
private String data;
public TerminalExpression(String data) {
this.data = data;
}
@Override
public boolean interpret(String context) {
if (context.contains(data)) {
return true;
}
return false;
}
}
/**
* @author zhongtao
* @date 2023/5/31 10:34
*/
public class OrExpression implements Expression {
private Expression expr1 = null;
private Expression expr2 = null;
public OrExpression(Expression expr1, Expression expr2) {
this.expr1 = expr1;
this.expr2 = expr2;
}
@Override
public boolean interpret(String context) {
return expr1.interpret(context) || expr2.interpret(context);
}
}
/**
* @author zhongtao
* @date 2023/5/31 10:34
*/
public class AndExpression implements Expression {
private Expression expr1 = null;
private Expression expr2 = null;
public AndExpression(Expression expr1, Expression expr2) {
this.expr1 = expr1;
this.expr2 = expr2;
}
@Override
public boolean interpret(String context) {
return expr1.interpret(context) && expr2.interpret(context);
}
}
3、InterpreterPatternDemo 使用 Expression 类来创建规则,并解析它们
/**
* @author zhongtao
* @date 2023/5/31 10:35
*/
public class InterpreterPatternDemo {
//规则:小王 和 小明 是男性
public static Expression getMaleExpression() {
Expression robert = new TerminalExpression("小王");
Expression john = new TerminalExpression("小明");
return new OrExpression(robert, john);
}
//规则:小红 是一个已婚的女性
public static Expression getMarriedWomanExpression() {
Expression julie = new TerminalExpression("小红");
Expression married = new TerminalExpression("结婚");
return new AndExpression(julie, married);
}
public static void main(String[] args) {
Expression isMale = getMaleExpression();
Expression isMarriedWoman = getMarriedWomanExpression();
System.out.println("小王是男性? " + isMale.interpret("小王"));
System.out.println("小红是一个已婚的女性? " + isMarriedWoman.interpret("结婚的小红"));
}
}
4、执行程序,输出结果
小王是男性? true
小红是一个已婚的女性? true
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
2018-05-31 Java中多个集合的交集,并集和差集