设计模式之解释器模式

得意时要看淡,失意时要看开。不论得意失意,切莫大意;不论成功失败,切莫止步。志得意满时,需要的是淡然,给自己留一条退路;失意落魄时,需要的是泰然,给自己觅一条出路设计模式之解释器模式,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

什么是设计模式
设计模式是经常使用、大多数人知道,有特定目录的代码设计经验。设计模式可以提高代码可维护性,可提升代码运行效率,也能提高系统可靠性。设计模式可以分为三类,分别是创建型、结构型和行为型。以下就解释器模式简要概述。

什么是解释器模式
解释器模式就是评估语法或表达式的方式。这种模式实现一个表达式接口,该接口负责解析上下文,也是属于行为型模式。

应用场景
1、SQL解析
2、表达式解析验证,比如正则表达式
3、需要灵活解析验证的其他场景

优势与劣势
优点:可扩展性好,业务灵活
缺点:复杂的业务逻辑不好维护

小试牛刀
比如我们业务需要写一个验证上下文字符是否包含某一个字符串,这个时候我们可以用解释器模式设计一个表达式。
首先我们可以定义一个表达式接口Expression,提供解释方法interpreter;然后我们分别实现上下文字段分别包含某字符类CheckExpression,多个上下文是否同时包含字符串类AndExpression,多个上下文是否任意一个包含字符串类OrExpression。最后,我们定义好具体的表达式传入需要验证的字符串即可。
类的依赖关系为:
在这里插入图片描述

1、创建验证表达式接口并提供解释方法

/**
 * 表达式接口
 * @author senfel
 * @version 1.0
 * @date 2022/8/30 10:43
 */
public interface Expression {

    /**
     * 解释方法
     * @param str 字段
     */
    Boolean interpreter(String str);

}

2、定义单一验证字符串表达式类并实现验证接口

/**
 * 验证表达式
 * 验证上下文是否包含字段
 * @author senfel
 * @version 1.0
 * @date 2022/8/30 10:59
 */
public class CheckExperssion implements Expression{

    /**
     * 目标上下文
     */
    private String context;

    public CheckExperssion(String context) {
        this.context = context;
    }


    /**
     * 验证上下文是否包含字段
     * @param str
     * @author senfel
     * @date 2022/8/30 11:04
     * @return java.lang.Boolean
     */
    @Override
    public Boolean interpreter(String str) {
        if(context.contains(str)){
            return true;
        }
        return false;
    }
}

3、定义复杂的验证类,同时满足多个表达式、任意满足一个表达式的验证类并实现验证接口

/**
 * AND表达式
 * @author senfel
 * @version 1.0
 * @date 2022/8/30 11:01
 */
public class AndExperssion implements Expression{

    /**
     * 表达式1
     */
    private CheckExperssion checkExperssion1;
    /**
     * 表达式2
     */
    private CheckExperssion checkExperssion2;

    public AndExperssion(CheckExperssion checkExperssion1, CheckExperssion checkExperssion2) {
        this.checkExperssion1 = checkExperssion1;
        this.checkExperssion2 = checkExperssion2;
    }


    /**
     * 验证两个两个表达式是否都同时包含字段
     * @param str
     * @author senfel
     * @date 2022/8/30 11:05
     * @return java.lang.Boolean
     */
    @Override
    public Boolean interpreter(String str) {
        return checkExperssion1.interpreter(str) && checkExperssion2.interpreter(str);
    }
}
/**
 * OR表达式
 * @author senfel
 * @version 1.0
 * @date 2022/8/30 11:03
 */
public class OrExpression implements Expression{
    /**
     * 表达式1
     */
    private CheckExperssion checkExperssion1;
    /**
     * 表达式2
     */
    private CheckExperssion checkExperssion2;

    public OrExpression(CheckExperssion checkExperssion1, CheckExperssion checkExperssion2) {
        this.checkExperssion1 = checkExperssion1;
        this.checkExperssion2 = checkExperssion2;
    }


    /**
     * 验证两个两个表达式是否任意一个包含字段
     * @param str
     * @author senfel
     * @date 2022/8/30 11:05
     * @return java.lang.Boolean
     */
    @Override
    public Boolean interpreter(String str) {
        return checkExperssion1.interpreter(str) || checkExperssion2.interpreter(str);
    }
}

4、解释器模式测试

/**
 * 解释器模式测试
 * @author senfel
 * @version 1.0
 * @date 2022/8/30 11:06
 */
@SpringBootTest
public class TestInterpreterPattern {


    /**
     * 验证表达式中是否包含字段
     * 同时验证两个表达式是否都包含字段
     * 同时验证两个表达式任意一个包含字段
     */
    @Test
    public void test(){
        //定义验证表达式
        String context = "interpreter pattern test";
        CheckExperssion checkExperssion = new CheckExperssion(context);
        //验证单个表达式
        String str = "interpreter";
        if(checkExperssion.interpreter(str)){
            System.err.println("测试解释器模式成功,上下文:"+context+" 包含字符串:"+str);
        }else{
            System.err.println("测试解释器模式成功,上下文:"+context+" 不包含字符串:"+str);
        }
        //验证两个表达式是否都包含
        String context2 = "pattern test";
        CheckExperssion checkExperssion2 = new CheckExperssion(context2);
        AndExperssion andExperssion = new AndExperssion(checkExperssion, checkExperssion2);
        if(!andExperssion.interpreter(str)){
            System.err.println("测试解释器模式成功,上下文:"+context+"/"+context2+" 没有同时包含字符串:"+str);
        }else{
            System.err.println("测试解释器模式成功,上下文:"+context+"/"+context2+" 同时包含字符串:"+str);
        }

        //验证两个表达式任意一个包含
        OrExpression orExpression = new OrExpression(checkExperssion, checkExperssion2);
        if(orExpression.interpreter(str)){
            System.err.println("测试解释器模式成功,上下文:"+context+"/"+context2+" 任意一个包含字符串:"+str);
        }else{
            System.err.println("测试解释器模式成功,上下文:"+context+"/"+context2+" 都不包含字符串:"+str);
        }

    }
}

验证结果:

测试解释器模式成功,上下文:interpreter pattern test 包含字符串:interpreter
测试解释器模式成功,上下文:interpreter pattern test/pattern test 同时包含字符串:interpreter
测试解释器模式成功,上下文:interpreter pattern test/pattern test 任意一个包含字符串:interpreter

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/154685.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!