【学习笔记】设计模式-解释器模式(Interpreter)

0 设计模式

不了解设计模式的小伙伴可以通过这篇文章了解一下什么是设计模式

https://blog.csdn.net/qq_42874315/article/details/120006447

1 解释器模式

解释器模式提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。

2 实现思路

在这里插入图片描述

我们将创建一个接口 Expression 和实现了 Expression 接口的实体类。

定义作为上下文中主要解释器的 TerminalExpression 类。

其他的类 OrExpression、AndExpression 用于创建组合式表达式。

测试类中使用 Expression 类创建规则和演示表达式的解析。

3 需要的类

  1. 表达式接口

  2. 接口的实现类

    存储表达式数据的实现类

    判断每个规则之间关系的(判断多个上方实现类的关系)

  3. 测试类

    测试类中使用规则类去判断存储数据的实现类

    具体的规则

4 具体实现

4.1 Expression(表达式接口)

/**
 * @Author ChenJiahao(五条)
 * @Date 2021/8/27 14:42
 */
public interface Expression {
    boolean interpret(String context);
}

4.2 接口实现类

4.2.1 TerminalExpression(存储数据)

/**
 * @Author ChenJiahao(五条)
 * @Date 2021/8/27 16:36
 */
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;
    }
}

4.2.2 判断规则之间关系

AndExpression

/**
 * @Author ChenJiahao(五条)
 * @Date 2021/8/27 16:52
 */
public 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);
    }
}

OrExpression

/**
 * @Author ChenJiahao(五条)
 * @Date 2021/8/27 16:51
 */
public 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);
    }
}

4.3 测试类

/**
 * @Author ChenJiahao(五条)
 * @Date 2021/8/27 16:53
 */
public class Test {

    // 规则:Robert或John是男性
    public static Expression getMaleExpression(){
        Expression robert = new TerminalExpression("Robert");
        Expression john = new TerminalExpression("John");
        return new OrExpression(robert,john);
    }

    // 规则:Julie是一个已婚的女性
    public static Expression getMarriedWomenExpression(){
        Expression julie = new TerminalExpression("Julie");
        Expression married = new TerminalExpression("Married");
        return new AndExpression(julie,married);
    }

    public static void main(String[] args) {
        Expression isMale = getMaleExpression();
        Expression isMarriedWomen = getMarriedWomenExpression();

        System.out.println("John or Robert is male? " + isMale.interpret("John"));
        System.out.println("Julia is a married women? " + isMarriedWomen.interpret("Married Julie"));
    }
}

5 思维导图

在这里插入图片描述

6 示例源码地址

https://github.com/ChenJiahao0205/design-pattern/tree/master

最后

我是通过马士兵老师的视频和菜鸟教程学习的,部分内容可能会有雷同

想阅读更多设计模式相关文章,欢迎到我的专栏【设计模式学习笔记】、【设计模式】中去查看

在23篇设计模式文章发布完成之后,我会公开完整的思维导图,点关注,不迷路

感谢大家看到这里,文章如有不足,欢迎大家指出;彦祖点个赞吧彦祖点个赞吧彦祖点个赞吧,欢迎关注程序员五条

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五条Programmer

比心~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值