你发年终奖了吗?

解释器模式通过构建语法结构来评估特定上下文,常用于SQL解析和符号处理。本文通过一个年终奖发放规则的例子,展示了如何使用解释器模式。规则为(勤劳的人 || 积极的人)&&(小明 || 小亮 || 小路)。文章实现了一个包含TerminalExpression和NoTerminalExpression的解释器,用以判断员工是否符合发放条件,并在Context中进行解析。最终运行结果显示了不同情况下的年终奖发放决策。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

年终奖是很多人的快乐,也是很多人的痛。

当然快乐与你有没有缘,就要看快乐与你有没有缘了,这是个玄学。

在一些公司是如果一个人有年终奖其他人就会都有,在一些公司是根据你整年的表现来的。

比如有这么一家公司:

他们发年终奖规则是这样的:勤劳的人、积极的人 并且 名字是小明、小亮、小路的才会发。

比如:勤劳的小亮、积极的小明这类的就会发年终奖。

其他比如:偷懒的小明、勤劳的小丽 这种的是不给发的。

用表达式表示是否发年终奖是这样的:

(勤劳的人 || 积极的人)&& (小明 || 小亮 || 小路)

那我们今天用这个例子给大家讲一个设计模式——解释器模式

一、是什么

解释器模式(Interpreter Pattern)提供了评估语言的语法,这种模式实现了一个表达式接口,该接口解释一个特定的上下文。

这种设计模式多用在SQL解析、符号处理引擎等。

它长这样:

在这里插入图片描述

我是这样理解的:

其他他就是把我们的if else 按照某种规则进行分类处理,把条件传入解析引擎,然后返回计算结果。

二、实现

IExpression

package interpreter;

/**
 * @author 木子的昼夜编程
 * 规则抽象
 */
public interface IExpression {
    public boolean interpret(String data);
}

TerminalExpression

package interpreter;

import java.util.Arrays;
import java.util.List;

/**
 * @author 木子的昼夜编程
 * 终结表达式  符合conditions的
 */
public class TerminalExpression implements  IExpression{

    // 定义条件
    List<String> conditions;
    public TerminalExpression(String ... args){
        conditions =  Arrays.asList(args);
    }
    // 判断是否是勤奋、积极、小明、小亮等等
    @Override
    public boolean interpret(String data) {
        if (data == null) {
            return false;
        }
        return conditions.contains(data);
    }
}

NoTerminalExpression

package interpreter;

/**
 * @author 木子的昼夜编程
 */
public class NoTerminalExpression implements IExpression {
    IExpression expression01;
    IExpression expression02;
    // 非终结表达式 需要调用终结表达式
    public NoTerminalExpression(IExpression expression1, IExpression expression2){
        this.expression01 = expression1;
        this.expression02 = expression2;
    }
    @Override
    public boolean interpret(String data) {
        String[] arrs = data.split("的");
        if (arrs == null || arrs.length != 2) {
            return false;
        }
        // 判断是否同时符合2个条件
        return expression01.interpret(arrs[0]) && expression02.interpret(arrs[1]);
    }
}

Context

​```package interpreter;

/**
 * @author 木子的昼夜编程
 */
public class Context {
    private String[] types = { "勤奋", "积极"};
    private String[] names = { "小明", "小亮", "小路"};
    // 最牛的表达式
    IExpression expression;
    public Context() {
        IExpression typeExpression = new TerminalExpression(types);
        IExpression nameExpression = new TerminalExpression(names);
        expression = new NoTerminalExpression(typeExpression, nameExpression);
    }

    //调用相关表达式类的解释方法
    public void freeRide(String info) {
        boolean ok = expression.interpret(info);
        if(ok){
            System.out.println("给"+info+"发年终奖!");
        } else {
            System.out.println("不给"+info+"发年终奖!");
        }
    }
}

Client

package interpreter;

/**
 * @author 木子的昼夜编程
 */
public class Client {
    public static void main(String[] args) {
        Context context = new Context();
        context.freeRide("勤奋的小亮");
        context.freeRide("积极的小明");
        context.freeRide("懒惰的小莉");
        context.freeRide("偷懒的小明");
    }
}

输出结果:

在这里插入图片描述

这几个类的关系:

在这里插入图片描述

三、唠唠

解释器模式好像平时很少见过,见得少也可以学习学习。

有钱人见得少,你不还想着成为有钱人的嘛 , 哈哈!

假期剩下2天了,珍惜吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值