流行且易于理解的设计模式分析-解释器模式

电脑杂谈  发布时间:2020-07-12 13:23:51  来源:网络整理

c 解释器模式_c 解释器模式_解释器模式 c

今天我们将讨论解释器模式[Interpreter Pattern],如何理解这种模式?一个简单的例子,汉英翻译的作用是什么?将未知的英语翻译成中文以便于理解,或将中文翻译成英文以供使用. 目的是翻译和解释该语言,以促进理解和使用. 那解释器模式呢?有类似的逻辑. 该模式实现了一个表达接口,用于解释特定的上下文. 主要针对一些固定的语法,构造一个解释器来解释句子.

在软件系统中c 解释器模式,如果存在一些更复杂的特殊领域问题,则可疑模式将不断重复出现. 通用编程的这种使用将使程序编码变得非常频繁. 在这种情况下,该特定领域中的问题将转换为某种语法规则的句子. 构造一个解释器来解释这些句子,从而解决问题.

给出一种语言,定义其语法表示形式,并定义一个解释器,该解释器使用徽标来解释该语言中的句子.

看看上面的案例图,让我们看一下其中包含的五个部分:

c 解释器模式_c 解释器模式_解释器模式 c

抽象表达式: 定义解释器接口和约定的操作. Interpret接口专门用于实现解释器的功能

终端表达式: 接口和语法中实现抽象表达式的每个终端都有其对应的特定终端表达式.

非终止表达式: 语法中的每个规则都需要一个特定的非终止表达式,通常是语法中的一个运算符或一些关键字.

上下文类: 此角色用于存储与终止符相对应的特定位置.

c 解释器模式_c 解释器模式_解释器模式 c

客户端: 指使用解释器的客户端.

让我们看一个在日常程序开发中偶尔遇到中文到阿拉伯数字的情况. 对于某些操作,需要中文到数字计算. 让我们看看如何解决这个问题:

namespace Interpreter_Pattern
{
    class InterpreterPattern
    {
    }
    /// <summary>
    /// Context: 环境类
    /// </summary>
    public class Context
    {
        private string _statement;
        public Context(string statement)
        {
            this._statement = statement;
            contextMap.Add("一", 1);
            contextMap.Add("二", 2);
            contextMap.Add("三", 3);
            contextMap.Add("四", 4);
            contextMap.Add("五", 5);
            contextMap.Add("六", 6);
            contextMap.Add("七", 7);
            contextMap.Add("八", 8);
            contextMap.Add("九", 9);
        }
        public string Statement
        {
            get { return this._statement; }
            set { this._statement = value; }
        }
        public Dictionary<string, int> contextMap = new Dictionary<string, int>();
    }
    /// <summary>
    /// AbstractExpression: 抽象表达式
    /// </summary>
    public abstract class AbstractExpression
    {
        public abstract void Interpret(Context context);
    }
    public class TerminalExpression : AbstractExpression
    {
        public override void Interpret(Context context)
        {
            if (context.Statement!=null)
            {
                foreach (var Key in context.contextMap.Keys)
                {
                    if (context.Statement.Contains(Key))
                    {
                        context.Statement= context.Statement.Replace(Key, context.contextMap[Key].ToString());// context.contextMap[Key]);
                    }
                }
            }
            //return context;
        }
    }
    public class NonterminalExpression : AbstractExpression
    {
        public override void Interpret(Context context)
        {
            if (context.Statement.Contains("加"))
            {
                context.Statement= context.Statement.Replace("加","+");
            }
            if (context.Statement.Contains("减"))
            {
                context.Statement= context.Statement.Replace("减", "-");
            }
            if (context.Statement.Contains("乘"))
            {
                context.Statement= context.Statement.Replace("乘", "*");
            }
            if (context.Statement.Contains("除"))
            {
                context.Statement= context.Statement.Replace("除", "/");
            }
            //return context;
        }
    }
}

namespace Interpreter_Pattern
{
    class Program
    {
        static void Main(string[] args)
        {
            Context context = new Context("三加八加九减二乘五除三");
            AbstractExpression abstractExpression = new TerminalExpression();
             abstractExpression.Interpret(context);
            AbstractExpression noabstractExpression = new NonterminalExpression();
             noabstractExpression.Interpret(context);
            Console.WriteLine(context.Statement);
        }
    }
}

解释器模式 c_c 解释器模式_c 解释器模式

1. 需要解释和执行的语言的句子可以表示为抽象语法树.

2. 某些重复性问题可以用一种简单的语言表达.

3. 当语言的语法相对简单时,您可以考虑

1. 高度可扩展性和灵活性.

c 解释器模式_解释器模式 c_c 解释器模式

2. 添加新的解释表达式的方式更加方便.

3. 易于实现的简单语法.

1. 可用场景很少.

2. 很难维持复制的语法.

3. 解释器模式将导致类扩展.

至此c 解释器模式,我们已经完成了解释器模式的阅读. 实际上,如果我们考虑一下,正则表达式是否有点相似?正则表达式也是典型的解释器. 解释器模式是定义表示形式和给定语言的解释器. 然后使用此解释器来解释该语言中的句子. 解释器模式在通常情况下很少使用,通常用于表达式计算或编译器,SQL语句解析等. 到目前为止,我们已经介绍了23种设计模式. 我们可以通过本系列文章开头的文章进行全面回顾.


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-277699-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 温喜燕
        温喜燕

        这个一直很棒

      • 夏秋艳
        夏秋艳

        对于进入12海里的外国舰船也不是立马就给予击沉和撞击

      • 冯应瑞
        冯应瑞

        全系统的可靠性

      热点图片
      拼命载入中...