0
点赞
收藏
分享

微信扫一扫

大聪明教你学Java设计模式 | 第二十一篇:解释器模式

fbd4ffd0717b 2022-04-22 阅读 46

前言

大聪明在写代码的过程中发现设计模式的影子是无处不在,设计模式也是软件开发人员在软件开发过程中面临的一般问题的解决方案。大聪明本着“独乐乐不如众乐乐”的宗旨与大家分享一下设计模式的学习心得。

解释器模式

🍓🍓什么是解释器模式🍓🍓

听完这解释器模式的定义是不是顿时感觉一脸懵?什么语法、表达式,都是些什么鬼?我们接着往下看👇
在这里插入图片描述
我们在定义中提到的文法可以将其理解为一种规则,就好比汉语中一句完整的话必须由“主谓宾”三者构成一样。而句子代表着符合文法规则的一种表现,可以简单理解成符合汉语规则的一句话;语言指的是将所以句子汇集起来的一个集合就是语言。我们要想了解“语言”要表达的信息,我们就必须定义相应的语法规则。这样,书写者就可以根据语法规则来书写“句子”,阅读者根据语法规则来阅读“句子”,这样才能做到信息的正确传递。而本文讲到的解释器模式,其实就是用来实现根据语法规则解读“句子”的解释器。

可以说的再具体一些:在软件开发中,我们可能会遇到有些问题多次重复出现而且有一定的相似性和规律性的情况。那么如果我们将这些情况归纳成一种简单的语言,那么每一种情况都是组成该语言的一个句子。其实在我们日常开发的过程中,真正需要使用解释器模式的场景并不多,所以本节内容只需要简单了解一下就好啦~ 不过话说回来了,虽然使用解释器模式的实例不是很多,但对于满足以上特点,且对运行效率要求不是很高的应用实例,如果用解释器模式来实现,其效果是非常好的。

🍓🍓解释器模式的实现🍓🍓

🍎🍎创建解释器接口类🍎🍎

/**
 * 解释器接口类
 * @description: Expression
 * @author: 庄霸.liziye
 * @create: 2022-04-22 19:01
 **/
public interface Expression {

    /**
     * 解释传递进来的context是否为真
     * @param context
     * @return
     */
    public boolean interpret(String context);
}

🍎🍎实现解释器接口🍎🍎

/**
 * 主要解释器
 * @description: TerminalExpression
 * @author: 庄霸.liziye
 * @create: 2022-04-22 19:02
 **/
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;
    }
}

/**
 * 其他解释器——用于组合表达式
 * @description: OrExpression
 * @author: 庄霸.liziye
 * @create: 2022-04-22 19:04
 **/
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);
    }
}

/**
 * 其他解释器——用于组合表达式
 * @description: AndExpression
 * @author: 庄霸.liziye
 * @create: 2022-04-22 19:07
 **/
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);
    }
}

🍎🍎创建规则并进行解释🍎🍎

/**
 * @description: Test
 * @author: 庄霸.liziye
 * @create: 2022-04-11 11:31
 **/
public class Test {

    /**
     * 定义规则:张三和李四是男性
     */
    public static Expression getMaleExpression(){
        Expression robert = new TerminalExpression("张三");
        Expression john = new TerminalExpression("李四");
        return new OrExpression(robert, john);
    }

    /**
     * 定义规则:小王是一名司机
     */
    public static Expression getDriverExpression(){
        Expression julie = new TerminalExpression("小王");
        Expression married = new TerminalExpression("司机");
        return new AndExpression(julie, married);
    }

    public static void main(String[] args) {

        Expression isMale = getMaleExpression();
        Expression isDriver = getDriverExpression();

        System.out.println("张三是男生吗? " + isMale.interpret("张三"));
        System.out.println("王五是男生吗? " + isMale.interpret("王五"));

        System.out.println("小王是司机吗? " + isDriver.interpret("小王是司机"));
        System.out.println("小赵是司机吗? " + isDriver.interpret("小赵是厨师"));
    }
}

🍎🍎运行结果🍎🍎

在这里插入图片描述

🍓🍓解释器模式的优点与缺点🍓🍓

最后我们总结一下解释器模式的优点与缺点👇

🍌🍌优点🍌🍌

🍌🍌缺点🍌🍌

小结

本人经验有限,有些地方可能讲的没有特别到位,如果您在阅读的时候想到了什么问题,欢迎在评论区留言,我们后续再一一探讨🙇‍

如果文章中有错误,欢迎大家留言指正;若您有更好、更独到的理解,欢迎您在留言区留下您的宝贵想法。

举报

相关推荐

0 条评论