设计模式学习笔记--解释器模式

十六、解释器模式

解释器模式(interpreter pattern)提供了评估语言的语法或表达式的方式,通过实现接口来解释一个特定的上下文,常用语sql解析,符号处理等。
- 优点:可扩展性好、灵活,易于实现简单文法。
- 缺点:可用场景比较少,复杂文法难于维护。

实现

创建一个解释接口Expression和实现类,具体的解释规则。定义一个主要的解释器,和其他的组合表达式类。
interpreter
- 创建接口

IExpression.java

/**
 * Created by lenovo on 2016/11/30 0030.
 * 解释器接口
 */
public interface IExpression {
    public boolean interpret(String context);
}
  • 实现接口

TerminalExpression.java

/**
 * Created by lenovo on 2016/11/30 0030.
 * 解释器实现类
 */
public class TerminalExpression implements IExpression{
    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.java

/**
 * Created by lenovo on 2016/11/30 0030.
 * OR逻辑的解释器
 */
public class OrExpression implements IExpression{
    private IExpression exp1 = null;
    private IExpression exp2 = null;

    public OrExpression(IExpression exp1,IExpression exp2){
        this.exp1 = exp1;
        this.exp2 = exp2;
    }

    @Override
    public boolean interpret(String context) {
        return exp1.interpret(context) || exp2.interpret(context);
    }
}

AndExpression.java

/**
 * Created by lenovo on 2016/11/30 0030.
 * AND逻辑的解释器
 */
public class AndExpression implements IExpression{
    private IExpression exp1 = null;
    private IExpression exp2 = null;

    public AndExpression(IExpression exp1, IExpression exp2){
        this.exp1 = exp1;
        this.exp2 = exp2;
    }

    @Override
    public boolean interpret(String context) {
        return exp1.interpret(context) && exp2.interpret(context);
    }
}
  • 演示

InterpreterPatternDemo.java

/**
 * Created by lenovo on 2016/11/30 0030.
 * 解释器演示
 */
public class InterpreterPatternDemo {
    //规则,robert和john是男性
    public static IExpression getMaleExpression(){
        IExpression robert = new TerminalExpression("Robert");
        IExpression john = new TerminalExpression("John");
        return new OrExpression(robert,john);
    }
    //规则,julie 是已婚女性
    public static IExpression getMarriedWomanExpression(){
        IExpression julie = new TerminalExpression("Julie");
        IExpression married = new TerminalExpression("Married");
        return new AndExpression(julie,married);
    }
    public static void main(String[] args){
        IExpression isMale = getMaleExpression();
        IExpression isMarriedWoman = getMarriedWomanExpression();
        //就是用context的上下文,去匹配定义的规则,若满足,则是符合指令。
        System.out.println("John is male ? "+isMale.interpret("John"));
        System.out.println("Julie is a married woman ? "+isMarriedWoman.interpret("Married Julie"));
    }
}
  • 输出
John is male ? true
Julie is a married woman ? true
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值