当前位置: 首页 > news >正文

每日学一个设计模式23——解释器模式

解释器模式(语法规则也是类)

用处

这种模式实现了一个表达式接口,该接口解释一个特定的上下文

角色

  • AbstractExpression(抽象表达式)
    该角色定义了语法树节点的共同接口(API)。
  • TerminalExpression(终结符表达式)
    该角色对应BNF中的终结符表达式。
  • NonterminalExpression(非终结符表达式)
    该角色对应BNF中的非终结符表达式。
  • Context(上下文)
    该角色为解释器进行语法解析提供了必要的信息
  • Client(请求者)
    为了推到语法树,该角色会调用TerminalExpression角色和NoterminalExpression角色。

类图

在这里插入图片描述
由类图可知

  • Context获取需要解释的内容,调用getInfoToIntrepret方法。将需要解释的内容传入Expression,并递归调用interpret方法,直到调用TerminalExpression的interpret方法则递归结束,返回答案。

举例

//Client和Context角色
public class Main {
    //规则: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 getMarriedWomanExpression(){
        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 isMarriedWoman = getMarriedWomanExpression();

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

//Expression角色
interface Expression {
    boolean interpret(String context);
}

//TerminalExpression角色
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;
    }
}

//NoTerminalExpression角色
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);
    }
}
//NoTerminalExpression角色
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);
    }
}

总结

  • 符合开闭原则
  • 可利用的场景较少,一般用于解释语言或表达式。

相关文章:

  • C. Minimum Notation #823 div2
  • Python 教程之 Numpy(2)—— 数组
  • 【踩坑】在linux服务器上配置mysql并开放3306端口
  • JAVA基础(四十九)——自定义泛型
  • MySQL中的不等于
  • 【Redis】Redis高级:主从
  • 二进制方式安装k8s高可用集群(一)
  • Exception in thread main org.apache.ibatis.exceptions.PersistenceException:报错解决
  • mysql 数据库使用分享
  • @NoArgsConstructor和@AllArgsConstructor,@Builder
  • 比较Hive数据库与MySQL数据库
  • PMP每日一练 | 考试不迷路-9.26(包含敏捷+多选)
  • 【Linux修炼】1.常见指令(上)
  • 文件上传-- Web渗透
  • Redis:13-Redis持久化之RDB
  • 【刷算法】求1+2+3+...+n
  • 【知识碎片】第三方登录弹窗效果
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • es6
  • express + mock 让前后台并行开发
  • GraphQL学习过程应该是这样的
  • gulp 教程
  • idea + plantuml 画流程图
  • leetcode388. Longest Absolute File Path
  • Linux CTF 逆向入门
  • Making An Indicator With Pure CSS
  • Object.assign方法不能实现深复制
  • python大佬养成计划----difflib模块
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • 彻底搞懂浏览器Event-loop
  • 构建二叉树进行数值数组的去重及优化
  • 基于axios的vue插件,让http请求更简单
  • 简单数学运算程序(不定期更新)
  • 将 Measurements 和 Units 应用到物理学
  • 前端代码风格自动化系列(二)之Commitlint
  • 应用生命周期终极 DevOps 工具包
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • #{}和${}的区别是什么 -- java面试
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (3)llvm ir转换过程
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (二开)Flink 修改源码拓展 SQL 语法
  • (分布式缓存)Redis哨兵
  • (三)终结任务
  • (推荐)叮当——中文语音对话机器人
  • (转)http-server应用
  • (转)Linq学习笔记
  • ****Linux下Mysql的安装和配置
  • .NET 中创建支持集合初始化器的类型
  • .Net(C#)常用转换byte转uint32、byte转float等
  • [ CTF ] WriteUp-2022年春秋杯网络安全联赛-冬季赛