解释器模式 (Interpreter Pattern)

给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。

复制代码
public class Main {
    
    public static void main(String[] args) {
        // 可以自由地定义一些文法规则
        Expression isMale = getMaleExpression();
        Expression isMarriedWoman = getMarriedWomanExpression();
   
        System.out.println("John is male? " + isMale.interpret("John"));
        System.out.println("Julie is a married women? " + isMarriedWoman.interpret("Married Julie"));
    }
    
    // 定义一条规则:Robert 和 John 是男性
    public static Expression getMaleExpression(){
        Expression robert = new TerminalExpression("Robert");
        Expression john = new TerminalExpression("John");
        // 返回的是一条规则,如果两条语句有一条是true即返回true
        return new OrExpression(robert, john);
    }
    // 定义一条规则:Julie 是一个已婚的女性
    public static Expression getMarriedWomanExpression(){
        Expression julie = new TerminalExpression("Julie");
        Expression married = new TerminalExpression("Married");
        // 两条语句都要为true才能返回true
        return new AndExpression(julie, married);    
    }
}

interface Expression {
    public boolean interpret(String context);
}

class TerminalExpression implements Expression {
    
    private String data;
  
    public TerminalExpression(String data){
        this.data = data; 
    }
  
    @Override
    public boolean interpret(String context) {
        // 是否属于子串,即判断传入语句context中是否有相应的关键字data
        if(context.contains(data)){
            return true;
        }
        return false;
    }
}
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);
    }
}
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);
    }
}
复制代码

 

posted @   HanselHuang  阅读(44)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示