首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

设计模式-解释器模式

定义

解释器模式(Interpreter Pattern):Java解释器模式是一种行为设计模式,它定义了一种语言和该语言的解释器,使得可以使用该语言来表达一些特定的操作。该模式适用于需要解释一些特定语言的场景,例如编译器、表达式计算器等。

解释器模式的关键点如下:

定义一个访问点(可以是方法或者属性),用于访问对象的状态。

实现接口,使得所有实现该接口的对象都可以访问该访问点。

通过访问点(遥信)调用实现接口的对象,远程调用该接口的对象。

实现接口的对象可以同时增加和删除远程调用的方法。

解释器模式是一种非常有用的设计模式,它可以帮助我们实现远程访问对象的状态。通过使用解释器模式,我们可以将一些需要远程访问的对象的状态放在一个中央控制器中,中央控制器可以通过访问点来远程访问这些对象的状态,使得代码更加简洁和易于维护。同时,解释器模式也可以提高程序的可扩展性和可维护性,使得代码更加易于扩展和修改。

在Java中,可以使用抽象语法树(AST)来表示语言表达式,并使用解释器来执行这些表达式。解释器模式通常包括以下几个组件:

抽象表达式(Abstract Expression):定义了一个抽象的解释器接口,该接口包含了解释器需要实现的方法。

终结符表达式(Terminal Expression):实现了抽象表达式接口的终结符,用于表示语言中的基本操作或值。

非终结符表达式(Non-Terminal Expression):实现了抽象表达式接口的非终结符,用于表示语言中的复杂操作。

上下文(Context):包含了解释器需要的一些全局信息,例如变量、函数等。

解释器(Interpreter):使用上述组件来解释语言表达式,并执行相应的操作。

示例

创建一个表达式接口 Expression。

public interface Expression {

public boolean interpreter(String content);

}

创建实现了上述接口的实体类。TerminalExpression、OrExpression、AndExpression。

public class TerminalExpression implements Expression {

private String data;

public TerminalExpression(String data) {

this.data = data;

}

@Override

public boolean interpreter(String content) {

// 是包含判断

return content.contains(data);

}

}

public class OrExpression implements Expression {

private Expression expression1;

private Expression expression2;

public OrExpression(Expression expression1, Expression expression2) {

this.expression1 = expression1;

this.expression2 = expression2;

}

@Override

public boolean interpreter(String content) {

return expression1.interpreter(content) || expression2.interpreter(content);

}

}

public class AndExpression implements Expression {

private Expression expression1;

private Expression expression2;

public AndExpression(Expression expression1, Expression expression2) {

this.expression1 = expression1;

this.expression2 = expression2;

}

@Override

public boolean interpreter(String content) {

return expression1.interpreter(content) && expression2.interpreter(content);

}

}

使用 Expression 类来创建规则,并解析它们。

/**

* 规则:jingbin 和 youlookwhat 是男性

*/

public static Expression getMaleExpression() {

TerminalExpression jingbin = new TerminalExpression("jingbin");

TerminalExpression youlookwhat = new TerminalExpression("youlookwhat");

return new OrExpression(jingbin, youlookwhat);

}

/**

* 规则:Julie 是一个已婚的女性

*/

public static Expression getMarriedWomanExpression() {

TerminalExpression julie = new TerminalExpression("Julie");

TerminalExpression married = new TerminalExpression("Married");

return new AndExpression(julie, married);

}

Expression maleExpression = getMaleExpression();

// jingbin is male: true

Log.e("---", "jingbin is male: " + maleExpression.interpreter("jingbin"));

Expression womanExpression = getMarriedWomanExpression();

// Julie is married woman: true

Log.e("---", "Julie is married woman: " + womanExpression.interpreter("Married Julie"));

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OxJ77DpC7e87uw0O_8tpFxjw0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券