Java中如何应用解释器模式进行设计?

2026-05-25 21:412阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1383个文字,预计阅读时间需要6分钟。

Java中如何应用解释器模式进行设计?

解释器模式用于解释文字面意思,同时解释某些内容的含义。这种设计模式在软件开发中应用较少。例如,SQL解析、符号处理引擎等,会用到解释器模式。主要适用于更底层的开发人员。

解释器模式字面意思,也即解释某些内容的含义。这种设计模式是实际开发中最不容易用到的。比如SQL解析,符号处理引擎,会用到解释器模式,属于更底层的开发人员才会用到的设计模式。

本文就以解释器模式的概念、角色和简单的例子说明解释器模式,读者对这部分内容了解即可。

一、概念

解释器模式是指给定一门语言,定义它的文法的一种表示(如:加减乘除表达式和正则表达式等),然后再定义一个解释器,该解释器用来解释我们的文法表示(表达式)。

解释器模式的结构与组合模式相似,不过其包含的组成元素比组合模式多,而且组合模式是对象结构型模式,而解释器模式是类行为型模式。

解释器模式中包含四个角色:

  • 抽象解释器(Abstract Expression)角色:定义解释器的接口,约定解释器的解释操作,主要包含解释方法 interpret()。

  • 终结符解释器(Terminal Expression)角色:是抽象表达式的子类,用来实现文法中与终结符相关的操作,文法中的每一个终结符都有一个具体终结表达式与之相对应。

  • 非终结符解释器(Nonterminal Expression)角色:也是抽象表达式的子类,用来实现文法中与非终结符相关的操作,文法中的每条规则都对应于一个非终结符表达式。

  • 环境(Context)角色:通常包含各个解释器需要的数据或是公共的功能,一般用来传递被所有解释器共享的数据,后面的解释器可以从这里获取这些值。

    解释器模式类结构图如图所示:

二、实现

接下来针对四个角色分别定义他们的实现。

抽象解释器:

/** * 声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享 * @author tcy * @Date 29-08-2022 */ public abstract class AbstractExpression { public abstract boolean interpret(String info); }

非终结符表达式:

/** * 非终结符表达式,为文法中的非终结符实现解释操作。对文法中每一条规则R1、R2...Rn都需要一个具体的非终结符表达式类 * @author tcy * @Date 29-08-2022 */ public class NonTerminalExpression extends AbstractExpression{ private AbstractExpression address=null; private AbstractExpression name=null; private AbstractExpression id=null; public NonTerminalExpression(AbstractExpression address, AbstractExpression name, AbstractExpression id) { this.address = address; this.name = name; this.id = id; } @Override public boolean interpret(String info) { String s[]=info.split("-"); return address.interpret(s[0])&&name.interpret(s[1])&&id.interpret(s[2]); } }

终结符表达式:

** * 实现与文法中的终结符相关联的解释操作,文法中每一个终结符都有一个具体终结表达式与之相对应 * @author tcy * @Date 29-08-2022 */ public class TerminalExpression extends AbstractExpression{ private Set<String> set =new HashSet<String>(); public TerminalExpression(String[] data) { for(int i=0; i<data.length;i++) set.add(data[i]); } @Override public boolean interpret(String info) { if(set.contains(info)) { return true; } return false; } }

上下文环境:

Java中如何应用解释器模式进行设计?

/** * 上下文环境 * @author tcy * @Date 29-08-2022 */ public class Context { private String[] shuzis={"1","2","3","4","5","6","7","8","9","0"}; private String[] xiaoxiezimus={"a","b","c","d","e","f","g","h","i","j","k","l"}; private String[] daxiezimus={"A","B","C","D","E","F","G"}; private AbstractExpression infomation; public Context() { AbstractExpression shuzi=new TerminalExpression(shuzis); AbstractExpression xiaoxiezimu=new TerminalExpression(xiaoxiezimus); AbstractExpression daxiezimu=new TerminalExpression(daxiezimus); infomation=new NonTerminalExpression(shuzi,xiaoxiezimu,daxiezimu); } public void jieshi(String info) { boolean ok=infomation.interpret(info); if(ok) System.out.println("正确! ["+info+"] 满足 [单个数字-单个小写-单个大写] 的条件"); else System.out.println("错误! ["+info+"] 不满足 [单个数字-单个小写-单个大写] 的条件"); } }

客户端:

/** * @author tcy * @Date 29-08-2022 */ public class Client { public static void main(String[] args) { Context people=new Context(); people.jieshi("2-a-A"); people.jieshi("11-A-5"); people.jieshi("你-好-吖"); people.jieshi("2aA"); } }

以上为解释器模式的简单案例,读者可以拉取代码到本地进行学习,本地源码下载。

三、应用场景

解释器模式在实际的软件开发中使用比较少,因为它会引起效率、性能以及维护等问题。

在JDK中的正则表达式中的Pattern类和Spring里面的ExpressionParse接口使用的是解释器模式的思想。

当一个语言需要解释执行,并且语言中的句子可以表示为一个抽象语法树的时候,如 XML 文档解释,整体来说还是一种应用较少的设计模式。

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对自由互联的支持。如果你想了解更多相关内容请查看下面相关链接

本文共计1383个文字,预计阅读时间需要6分钟。

Java中如何应用解释器模式进行设计?

解释器模式用于解释文字面意思,同时解释某些内容的含义。这种设计模式在软件开发中应用较少。例如,SQL解析、符号处理引擎等,会用到解释器模式。主要适用于更底层的开发人员。

解释器模式字面意思,也即解释某些内容的含义。这种设计模式是实际开发中最不容易用到的。比如SQL解析,符号处理引擎,会用到解释器模式,属于更底层的开发人员才会用到的设计模式。

本文就以解释器模式的概念、角色和简单的例子说明解释器模式,读者对这部分内容了解即可。

一、概念

解释器模式是指给定一门语言,定义它的文法的一种表示(如:加减乘除表达式和正则表达式等),然后再定义一个解释器,该解释器用来解释我们的文法表示(表达式)。

解释器模式的结构与组合模式相似,不过其包含的组成元素比组合模式多,而且组合模式是对象结构型模式,而解释器模式是类行为型模式。

解释器模式中包含四个角色:

  • 抽象解释器(Abstract Expression)角色:定义解释器的接口,约定解释器的解释操作,主要包含解释方法 interpret()。

  • 终结符解释器(Terminal Expression)角色:是抽象表达式的子类,用来实现文法中与终结符相关的操作,文法中的每一个终结符都有一个具体终结表达式与之相对应。

  • 非终结符解释器(Nonterminal Expression)角色:也是抽象表达式的子类,用来实现文法中与非终结符相关的操作,文法中的每条规则都对应于一个非终结符表达式。

  • 环境(Context)角色:通常包含各个解释器需要的数据或是公共的功能,一般用来传递被所有解释器共享的数据,后面的解释器可以从这里获取这些值。

    解释器模式类结构图如图所示:

二、实现

接下来针对四个角色分别定义他们的实现。

抽象解释器:

/** * 声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享 * @author tcy * @Date 29-08-2022 */ public abstract class AbstractExpression { public abstract boolean interpret(String info); }

非终结符表达式:

/** * 非终结符表达式,为文法中的非终结符实现解释操作。对文法中每一条规则R1、R2...Rn都需要一个具体的非终结符表达式类 * @author tcy * @Date 29-08-2022 */ public class NonTerminalExpression extends AbstractExpression{ private AbstractExpression address=null; private AbstractExpression name=null; private AbstractExpression id=null; public NonTerminalExpression(AbstractExpression address, AbstractExpression name, AbstractExpression id) { this.address = address; this.name = name; this.id = id; } @Override public boolean interpret(String info) { String s[]=info.split("-"); return address.interpret(s[0])&&name.interpret(s[1])&&id.interpret(s[2]); } }

终结符表达式:

** * 实现与文法中的终结符相关联的解释操作,文法中每一个终结符都有一个具体终结表达式与之相对应 * @author tcy * @Date 29-08-2022 */ public class TerminalExpression extends AbstractExpression{ private Set<String> set =new HashSet<String>(); public TerminalExpression(String[] data) { for(int i=0; i<data.length;i++) set.add(data[i]); } @Override public boolean interpret(String info) { if(set.contains(info)) { return true; } return false; } }

上下文环境:

Java中如何应用解释器模式进行设计?

/** * 上下文环境 * @author tcy * @Date 29-08-2022 */ public class Context { private String[] shuzis={"1","2","3","4","5","6","7","8","9","0"}; private String[] xiaoxiezimus={"a","b","c","d","e","f","g","h","i","j","k","l"}; private String[] daxiezimus={"A","B","C","D","E","F","G"}; private AbstractExpression infomation; public Context() { AbstractExpression shuzi=new TerminalExpression(shuzis); AbstractExpression xiaoxiezimu=new TerminalExpression(xiaoxiezimus); AbstractExpression daxiezimu=new TerminalExpression(daxiezimus); infomation=new NonTerminalExpression(shuzi,xiaoxiezimu,daxiezimu); } public void jieshi(String info) { boolean ok=infomation.interpret(info); if(ok) System.out.println("正确! ["+info+"] 满足 [单个数字-单个小写-单个大写] 的条件"); else System.out.println("错误! ["+info+"] 不满足 [单个数字-单个小写-单个大写] 的条件"); } }

客户端:

/** * @author tcy * @Date 29-08-2022 */ public class Client { public static void main(String[] args) { Context people=new Context(); people.jieshi("2-a-A"); people.jieshi("11-A-5"); people.jieshi("你-好-吖"); people.jieshi("2aA"); } }

以上为解释器模式的简单案例,读者可以拉取代码到本地进行学习,本地源码下载。

三、应用场景

解释器模式在实际的软件开发中使用比较少,因为它会引起效率、性能以及维护等问题。

在JDK中的正则表达式中的Pattern类和Spring里面的ExpressionParse接口使用的是解释器模式的思想。

当一个语言需要解释执行,并且语言中的句子可以表示为一个抽象语法树的时候,如 XML 文档解释,整体来说还是一种应用较少的设计模式。

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对自由互联的支持。如果你想了解更多相关内容请查看下面相关链接