行为型模式 - 解释器模式Interpreter

news2024/11/17 6:30:27

学习而来,代码是自己敲的。也有些自己的理解在里边,有问题希望大家指出。

 

模式的定义与特点

     解释器模式(Interperter Pattern),给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。解释器模式:给定一个语言后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。解释器模式将描述怎样在有了一个简单的文法后,使用模式设计解释这些语句。在解释器模式里面提到的语言是指任何解释器对象能够解释的任何组合。在解释器模式中需要定义一个代表文法的命令类的等级结构,也就是一系列的组合规则。每一个命令对象都有一个解释方法,代表对命令对象的解释。命令对象的等级结构中的对象的任何排列组合都是一个语言。

模式的优点

  • 可扩展性比较好,灵活。 
  • 增加了新的解释表达式的方式。 
  • 易于实现简单文法。

模式的缺点

  • 可利用场景比较少。 
  • 对于复杂的文法比较难维护。 
  • 解释器模式会引起类膨胀。 
  • 解释器模式采用递归调用方法。

 

using DesignPattern.InterpreterPattern;
using System;

namespace DesignPattern
{
    internal class Program
    {
        static void Main(string[] args)
        {
            InterpreterHelper();
        }

        #region Pattern - Interpreter
        static void InterpreterHelper()
        {
            Interpreter _root1 = new CheckContentsExistence("Root1");
            Interpreter _root2 = new CheckContentsExistence("Root1");
            Interpreter _orExpr1 = new OrExpression(_root1, _root2);
            Console.WriteLine($"root 存在么:{_orExpr1.Interpret("root")}");

            Console.WriteLine();

            Interpreter _shanshan = new CheckContentsExistence("Shanshan");
            Interpreter _pig = new CheckContentsExistence("pig");
            Interpreter _isExpr2 = new AndExpression(_shanshan, _pig);
            Console.WriteLine($"Shanshan is a little pig? {_isExpr2.Interpret("pig Shanshan")}");
            Console.ReadLine();
        }
        #endregion


    }
}

//======================================================================================

namespace DesignPattern.InterpreterPattern
{
    /// <summary>
    /// 解释器接口
    /// </summary>
    public interface Interpreter
    {
        /// <summary>
        /// 解释器
        /// </summary>
        /// <param name="context">具体内容</param>
        /// <returns></returns>
        bool Interpret(string context);
    }

    /// <summary>
    /// 解释具体内容是否存在该元素中
    /// </summary>
    public class CheckContentsExistence : Interpreter
    {
        private string m_data;

        public CheckContentsExistence(string data)
        {
            this.m_data = data;
        }

        public bool Interpret(string context)
        {
            if (context.Contains(m_data))
            {
                return true;
            }
            return false;
        }
    }

    /// <summary>
    /// 或运算
    /// </summary>
    public class OrExpression : Interpreter
    {
        private Interpreter m_expr1 = null;
        private Interpreter m_expr2 = null;

        public OrExpression(Interpreter expression1, Interpreter expression2)
        {
            this.m_expr1 = expression1;
            this.m_expr2 = expression2;
        }

        public bool Interpret(string context)
        {
            return m_expr1.Interpret(context) || m_expr2.Interpret(context);
        }
    }

    /// <summary>
    /// 和运算
    /// </summary>
    public class AndExpression : Interpreter
    {
        private Interpreter m_expr1 = null;
        private Interpreter m_expr2 = null;

        public AndExpression(Interpreter expression1, Interpreter expression2)
        {
            this.m_expr1 = expression1;
            this.m_expr2 = expression2;
        }

        public bool Interpret(string context)
        {
            return m_expr1.Interpret(context) && m_expr2.Interpret(context);
        }
    }
}

 

总结:

      个人觉得,应该是一个框架中有些特殊处理的信息,或者内容需要被处理,就会用到解释器模式,比如框架中使用string,不希望在字符串中出现信息,那就重写string,在遇到信息时直接过滤、或者是找到替代信息进行替换。


希望大家:点赞,留言,关注咯~    
😘😘😘😘

唠家常

今日分享结束啦,小伙伴们你们get到了么,你们有没有更好的办法呢,可以评论区留言分享,也可以加QQ:841298494,大家一起进步。

  • 客官,看完get之后记得点赞哟!
  • 小伙伴你还想要别的知识?好的呀,分享给你们😄

今日推荐

  • 博客杂货铺
  • GoF23 种设计模式的分类和功能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/149926.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智引未来,深兰科技机器人家族首次亮相TechG

12月31日&#xff0c;首届上海国际消费电子技术展(简称TechG)在南京国际博览中心圆满落下帷幕。作为全球消费电子技术领域的顶级行业盛会&#xff0c;本届展会共吸引了来自全球的300余家企业出席&#xff0c;共计逾2万名专业人士到场参观。阿里巴巴、蚂蚁科技、海尔、科大讯飞、…

PyQt6快速入门-菜单与工具栏

菜单与工具栏 接下来我们将了解一些常见的用户界面元素,您可能在许多其他应用程序中都见过它们——工具栏和菜单。 我们还将介绍Qt 提供的用于最小化不同 UI 区域之间的重复的整洁系统 — QAction。 1、Toolbars 最常见的用户界面元素之一是工具栏。 工具栏是用于在应用程序…

【微服务】Nacos 账号权限体系

目录 一、背景 1、账号体系 2、账号实体映射 二、方案 1、Nacos 资源模型 2、Nacos 授权 resource 2.1、授权 resource 组成 2.2、不同级别授权资源组成 3、Nacos 授权 Opers 4、Nacos 具体权限定义 4.1、Opers 组成 4.2、具体实例 4.3、工程实现 三、RBAC 设计实…

IDEA使用Spring initializr 创建SpringBoot项目超时问题解决办法

1.问题描述 IDEA使用Spring initializr 创建SpringBoot项目时经常会出现连接超时的问题&#xff0c;报错提示如下 还有一个提示非常简短就是 connect timed out 总之问题都是一样&#xff0c;可能因为是外网所以有时候会出现连接问题&#xff0c;多试几次会成功&#xff0c;…

AutoScraper——爬虫神器

AutoScraper是一个自动化的爬虫工具&#xff0c;非常智能&#xff0c;而且使用简单便捷。AutoScraper 是使用 Python 实现的 Web 爬虫&#xff0c;兼容 Python 3&#xff0c;能快速且智能获取指定网站上的数据&#xff0c;在github上具有4.8K⭐️。github链接&#xff1a;https…

有哪些你看了以后大呼过瘾的计算机书籍?

推荐几本让程序员们爱不释手的经典书。 1、代码整洁之道 鲍勃大叔作品&#xff0c;程序员&#xff0c;汇聚编程数十年编程生涯的心得体会&#xff0c;阐释如何解决软件开发人员、项目经理及软件项目领导们所面临的棘手的问题。 本书提出一种观点&#xff1a;代码质量与其整洁…

Qt+C/C++文章小说人物关系分析

程序示例精选 QtC文章小说人物关系分析 如需安装运行环境或远程调试&#xff0c;见文章底部微信名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<QtC/C文章小说人物关系分析>>编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易…

浅谈未来跨境电商发展的新趋势?

从21世纪初&#xff0c;互联网在我国应运而生&#xff0c;并且在国家政策的倾斜和互联网的渗透下&#xff0c;结合互联网商业巨头对全球互联网产业的优化布局&#xff0c;互联网技术逐渐得到完善&#xff0c;伴随着近年来直播带货以及互联网电商的加持&#xff0c;我国的线上购…

Crack:dhtmlx JavaScript UI Libraries 商业企业版

dhtmlx JavaScript UI Libraries 企业版 包含Ω578867473&#xff1a; JS Gantt Chart JS Scheduler JS UI Widgets Library JS Diagram Library JS Kanban Board JS To Do List JS Event Calendar JS Spreadsheet JS Pivot Table JS File Uploader JS Rich Text Editor Gantt…

家庭库存管理系统Homebox

本文完成于 2022 年的 10 月&#xff0c; 最近正好有网友在找这方面的软件&#xff0c;就给翻出来了&#xff1b;Homebox 通过存储位置和标签两个维度来管理物品&#xff0c;非常简单易用&#xff0c;希望能满足要求&#xff1b; 什么是 Homebox &#xff1f; Homebox 是一个自…

TensorFlow和PyTorch的实际应用比较

TensorFlow和PyTorch是两个最受欢迎的开源深度学习框架&#xff0c;这两个框架都为构建和训练深度学习模型提供了广泛的功能&#xff0c;并已被研发社区广泛采用。但是作为用户&#xff0c;我们一直想知道哪种框架最适合我们自己特定项目&#xff0c;所以在本文与其他文章的特性…

我阳了,一针疫苗未打

12月31日凌晨两点&#xff0c;我被热醒&#xff0c;浑身湿透。身体发出强烈信号&#xff0c;本能地催促我赶紧喝水&#xff0c;再不喝&#xff0c;要炸。毫不犹豫地&#xff0c;我走进厨房&#xff0c;摁下电水壶&#xff0c;1.5L 水&#xff0c;90度。几杯水下肚&#xff0c;身…

2020年MathorCup高校数学建模挑战赛—大数据竞赛B题遥感图像地块分割与提取求解全过程文档及程序

2020年MathorCup高校数学建模挑战赛—大数据竞赛 B题 遥感图像地块分割与提取 原题再现&#xff1a; 耕地的数量和质量是保持农业可持续发展的关键&#xff0c;利用卫星遥感影像可以识别并提取耕地&#xff0c;并对耕地进行遥感制图&#xff0c;准确的耕地分布能够为国家决策…

聚观早报 | 蚂蚁集团调整股东结构;「快看点」2 月 6 日终止运营

点击蓝字 / 关注我们 今日要闻&#xff1a;蚂蚁集团调整股东结构&#xff1b;「快看点」2 月 6 日终止运营&#xff1b;Google 同意为隐私问题进行赔偿&#xff1b;苹果已取消 iPhone SE 4 发布&#xff1b;Lightyear 2 太阳能汽车发布 蚂蚁集团调整股东结构1 月 7 日&#xf…

从0到1完成一个Vue后台管理项目(八、Menu改造完善、子组件创建、配置路由)

往期 从0到1完成一个Vue后台管理项目&#xff08;一、创建项目&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;二、使用element-ui&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;三、使用SCSS/LESS&#xff0c;安装图标库&#xff09; 从0到1完成一个Vu…

javaweb-拦截器与监听器FilterListener

Filter&Listener 1&#xff0c;Filter 1.1 Filter概述 Filter 表示过滤器&#xff0c;是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。 过滤器可以把对资源的请求拦截下来&#xff0c;从而实现一些特殊的功能。 如下图所示&#xff0c;浏览器可以访问服务器上的…

mybatisPlus3.5.2在NOT_NULL更新策略下自定义Mapper实现更新null值

版本 当前使用的mybatis plus版本如下 mybatis-plus-3.5.2.jar 默认更新配置 在这个更新策略下&#xff0c;调用mybatis基础的updateById等更新方法的时候会因为xml中的判断条件而更新不了null值&#xff0c;此时又不想修改全局的配置策略。 mybatis plus提供了 com.baomid…

LeetCode091之解码方法(相关话题:动态规划)

题目描述 一条包含字母 A-Z 的消息通过以下映射进行了 编码 &#xff1a; A -> "1" B -> "2" ... Z -> "26" 要 解码 已编码的消息&#xff0c;所有数字必须基于上述映射的方法&#xff0c;反向映射回字母&#xff08;可能有多种方法…

蓝奥声灯光联动在行业中的技术优势

随着科学技术的发展和人民生活水平的提高&#xff0c;人们对生活或工作的照明系统提出了新的要求&#xff0c;智能照明系统替代传统照明系统是家居智能化过程中必然要走的一步&#xff0c;传统的家居照明控制方式一般是通过电路中的开关来控制电路的导通与关断&#xff0c;开关…

【设计模式】我终于读懂了组合模式。。。

文章目录♈️学校院系展示需求♉️传统方案解决学校院系展示(类图)♐️传统方案解决学校院系展示存在的问题分析♊️组合模式基本介绍♋️组合模式原理类图♌️对原理结构图的说明-即(组合模式的角色及职责)♍️组合模式解决学校院系展示的 应用实例♎️接下来我们Debug下去看一…