设计模式-解释器模式

设计模式-解释器模式

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

class diagram

  • TerminalExpression: 终结符表达式
    实现文法中与终结符有关的解释操作。
    文法中的每一个终结符都有一个具体终结表达式与之相对应,比如公式R=R1+R2,R1和R2就是终结符,对应的解析R1和R2的解释器就是终结符表达式。
    通常一个解释器模式中只有一个终结符表达式,但有多个实例,对应不同的终结符(R1,R2)

  • NonterminalExpression: 非终结符表达式
    实现文法中与非终结符有关的解释操作。
    文法中的每条规则都对应于一个非终结符表达式。非终结符表达式一般是文法中的运算符或者其他关键字,比如公式R=R1+R2中,"+“就是非终结符,解析”+"的解释器就是一个非终结符表达式。非终结符表达式根据逻辑的复杂程度而增加,原则上每个文法规则都对应一个非终结符表达式

每个非终结符表达式都会对其他表达式产生依赖

我们拿一个二十四小时制时间显示解析器来举例

先定义抽象接口

public interface Expression {
    String interpreter(String time);
}

然后实现两个终结符表达式

public class HourExpression implements Expression {
    @Override
    public String interpreter(String hour) {
        String des = "";
        int real = Integer.parseInt(hour);

        if (real <= 12) {
            if (real < 6) {
                des += "凌晨";
            } else {
                des += "上午";
            }
        } else {
            real -= 12;
            if (real < 6) {
                des += "下午";
            } else {
                des += "晚上";
            }
        }

        des = des + real +"点";
        return des;
    }
}

public class MinuteExpression implements Expression {
    @Override
    public String interpreter(String minute) {
        return minute + "分";
    }
}

然后定义一个非终结符表达式

public class HourNotationExpression implements Expression {

    private Expression hourExpression;
    private Expression minuteExpression;

    public HourNotationExpression(Expression hourExpression, Expression minuteExpression) {
        this.hourExpression = hourExpression;
        this.minuteExpression = minuteExpression;
    }

    @Override
    public String interpreter(String time) {
        String[] data = time.split(":");
        return hourExpression.interpreter(data[0]) + minuteExpression.interpreter(data[1]);
    }
}

调用示例

public class Demo {
    public static void main(String[] args) {
        HourNotationExpression expression = new HourNotationExpression(new HourExpression(), new MinuteExpression());
        System.out.println(expression.interpreter("05:53"));
        System.out.println(expression.interpreter("11:11"));
        System.out.println(expression.interpreter("15:32"));
        System.out.println(expression.interpreter("23:09"));
    }
}

结果

result

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值