解释器模式
内容参考 w3cschool
分类:行为型设计模式
应用:对于一些固定文法构建一个解释句子的解释器。
目录
UML类图
创建表达式接口
public interface Expression {
/**
* 解释
* @param context 内容
* @return 布尔值
*/
boolean interpret(String context);
}
创建表达式实体类
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;
}
}
创建表达式操作类 与/非
OrExpression
public class OrExpression implements Expression{
private Expression expression1 = null;
private Expression expression2 = null;
public OrExpression(Expression expression1, Expression expression2) {
this.expression1 = expression1;
this.expression2 = expression2;
}
@Override
public boolean interpret(String context) {
return expression1.interpret(context)||expression2.interpret(context);
}
}
AndExpression
public class AndExpression implements Expression{
private Expression expression1 = null;
private Expression expression2 = null;
public AndExpression(Expression expression1, Expression expression2) {
this.expression1 = expression1;
this.expression2 = expression2;
}
@Override
public boolean interpret(String context) {
return expression1.interpret(context)&&expression2.interpret(context);
}
}
运行测试
public class ExecuteMain {
public static void main(String[] args) {
Expression male = getMaleExpression();
Expression isMarriedWoman = getMarriedWomanExpression();
System.out.println("Dcpnet01 is Male?"+male.interpret("Dcpnet01"));
System.out.println("Zy is a married woman?"+isMarriedWoman.interpret("Zy married"));
}
/**
* Dcpnet00 Dcpnet01 是男性
* @return 表达式
*/
public static Expression getMaleExpression(){
Expression Dcpnet00 = new TerminalExpression("Dcpnet00");
Expression Dcpnet01 = new TerminalExpression("Dcpnet01");
return new OrExpression(Dcpnet01,Dcpnet00);
}
/**
* Zy 是已婚女性
* @return 表达式
*/
public static Expression getMarriedWomanExpression(){
Expression Zy = new TerminalExpression("Zy");
Expression married = new TerminalExpression("married");
return new AndExpression(Zy,married);
}
}
Dcpnet01 is Male?true
Zy is a married woman?true
Process finished with exit code 0