行为型模式之解释器模式

概述

解释器模式是一种使用频率相对较低但学习难度较大的设计模式,它用于描述如何使用面向对象语言构成一个简单的语言解释器。在某些情况下,为了更好地描述某一些特定类型的问题,我们可以创建一种新的语言,这种语言拥有自己的表达式和结构,即文法规则,这些问题的实例将对应为该语言中的句子。此时,可以使用解释器模式来设计这种新的语言。对解释器模式的学习能够加深我们对面向对象思想的理解,并且掌握编程语言中文法规则的解释过程

定义

解释器模式(Interpreter Pattern):定义一个语言的文法,并且建立一个解释器来解释该语言中的句子,这里的“语言”是指使用规定格式和语法的代码。解释器模式是一种类行为型模式。

实现

节点类

    public interface Node
    {
        /// <summary>
        /// 翻译方法
        /// </summary>
        /// <returns></returns>
        int Interpret();
    }

值节点【非终结符表达式】

    public class ValueNode : Node
    {
        private int value;

        public ValueNode(int value)
        {
            this.value = value;
        }

        public int Interpret()
        {
            return this.value;
        }
    }

符号节点【终结符表达式】

    public abstract class SymbolNode : Node
    {
        protected Node left;
        protected Node right;

        public SymbolNode(Node left, Node right)
        {
            this.left = left;
            this.right = right;
        }

        public abstract int Interpret();
    }

加法节点

    public class AddNode : SymbolNode
    {
        public AddNode(Node left, Node right) : base(left, right)
        {
        }

        public override int Interpret()
        {
            return base.left.Interpret() + base.right.Interpret();
        }
    }

减法

    public class SubNode : SymbolNode
    {
        public SubNode(Node left, Node right) : base(left, right)
        {
        }

        public override int Interpret()
        {
            return base.left.Interpret() - base.right.Interpret();
        }
    }

乘法

    public class MulNode : SymbolNode
    {
        public MulNode(Node left, Node right) : base(left, right)
        {
        }

        public override int Interpret()
        {
            return base.left.Interpret() * base.right.Interpret();
        }
    }

除法

    public class DivNode : SymbolNode
    {
        public DivNode(Node left, Node right) : base(left, right)
        {
        }

        public override int Interpret()
        {
            return base.left.Interpret() / base.right.Interpret();
        }
    }

计算处理类

    public class Calculator
    {
        private Node node;

        public void build(String statement)
        {
            Node leftNode, rightNode;
            char[] charArray = statement.ToCharArray();
            string[] statementArr = charArray.Select(p => p.ToString()).Where(p => !string.IsNullOrWhiteSpace(p)).ToArray();

            for (int i = 0; i < statementArr.Length; i++)
            {
                if (statementArr[i].Equals("*"))
                {
                    leftNode = node;
                    rightNode = new ValueNode(int.Parse(statementArr[++i]));
                    node = new MulNode(leftNode, rightNode);
                }
                else if (statementArr[i].Equals("/"))
                {
                    leftNode = node;
                    rightNode = new ValueNode(int.Parse(statementArr[++i]));
                    node = new DivNode(leftNode, rightNode);
                }
                else if (statementArr[i].Equals("%"))
                {
                    leftNode = node;
                    rightNode = new ValueNode(int.Parse(statementArr[++i]));
                    node = new ModNode(leftNode, rightNode);
                }
                else {
                    node = new ValueNode(int.Parse(statementArr[i]));
                }
            }
        }

        public int Compute()
        {
            return node.Interpret();
        }
    }

客户端

    class Program
    {
        static void Main(string[] args)
        {
            String statement = "3 * 2 * 4 / 6 % 5";

            Calculator calculator = new Calculator();

            calculator.build(statement);

            int result = calculator.Compute();

            Console.ReadLine();
        }
    }

总结

1、 可扩展性比较好,灵活。

2、 增加了新的解释表达式的方式。

3、 易于实现文法。

缺点

1、 执行效率比较低,可利用场景比较少。

2、 对于复杂的文法比较难维护。

五、 模式适用场景

1、可以将一个需要解释执行的语言中的句子表示为一个抽象语法树。

2、一些重复出现的问题可以用一种简单的语言来进行表达。

3、文法较为简单。

时间: 2024-10-06 06:14:25

行为型模式之解释器模式的相关文章

(16):(行为型模式) Interpreter 解释器模式

(16):(行为型模式) Interpreter 解释器模式,布布扣,bubuko.com

设计模式-行为型模式,解释器模式(12)

解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式.这种模式实现了一个表达式接口,该接口解释一个特定的上下文.这种模式被用在 SQL 解析.符号处理引擎等. 对每个应用来说,至少有以下两种不同的用户分类.? 基本用户:这类用户只希望能够凭直觉使用应用.他们不喜欢花太多时间配置或学习应用的内部.对他们来说,基本的用法就足够了.? 高级用户:这些用户,实际上通常是少数,不介意花费额外的时间学习如何使用应用的高级特性.如果知道学会之后能得到以下好处

行为型设计模式之解释器模式(Interpreter)

结构 意图 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 适用性 当有一个语言需要解释执行, 并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式.而当存在以下情况时该模式效果最好: 该文法简单对于复杂的文法, 文法的类层次变得庞大而无法管理.此时语法分析程序生成器这样的工具是更好的选择.它们无需构建抽象语法树即可解释表达式, 这样可以节省空间而且还可能节省时间. 效率不是一个关键问题最高效的解释器通常不是通过直接解释语法分析树实现

浅谈架构模式之解释器模式

1定义 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. ·文法:即语法规则.在解释器模式中每一个语法都将对应一个解释器对象,用来处理相应的语法规则.它对于扩展.改变文法以及增加新的文法规则都很方便. ·句子:解释器模式描述了如何为简单的语言定义一个文法,如何在该语言中表示一个句子,以及如何解释这些句子. · 抽象语法树:在解释器模式中可以通过一种称之为抽象语法树(Abstract Syntax Tree, AST)的图形方式来直观地表示语言的构成

Interpreter模式(C++解释器模式)

Interpreter模式提供了一个实现语法解释器的框架,其目的就是使用一个解释器为用户提供一个一门定义语言语法表示的解释器,并且通过这个解释器来解释语言中的句子. Interpreter模式使用类来表示文法规则,因此方便于文法的扩展. 代码如下: #include <iostream> #include <string> using namespace std; class Context { public: Context(){} ~Context(){} }; class A

第17章 行为型模式—解释器模式

1. 解释器模式(Interpreter Pattern)的定义 (1)定义 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. ①文法:即语法规则.在解释器模式中每一个语法都将对应一个解释器对象,用来处理相应的语法规则.它对于扩展.改变文法以及增加新的文法规则都很方便. ②解释器模式描述了如何为简单的语言定义一个文法,如何在该语言中表示一个句子,以及如何解释这些句子. ③在解释器模式中可以通过一种称之为抽象语法树(Abstract Syntax T

设计模式(行为型)之解释器模式(Interpreter Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之访问者模式(Visitor Pattern)>http://blog.csdn.net/yanbober/article/details/45536787 概述 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个

设计模式(二十)解释器模式(Interpreter)-行为型

解释器模式Interpreter 解释器模式在软件开发中应用的比较少,它主要用在底层的编程语言设计上,因此不太容易理解. 联想:传一个算数表达式,对加减乘除自动匹配,能够自动计算其结果. 原理图 解释器模式实现原理图 单个运算符的数学公式计算机可以用来理解这个解释器模式的使用. 参考文献 [1] 郭峰.深入浅出设计莫模式[M].中国铁道出版社,2013(1):415-423.

深入浅出设计模式——解释器模式(Interpreter Pattern)

模式动机 如果在系统中某一特定类型的问题发生的频率很高,此时可以考虑将这些问题的实例表述为一个语言中的句子,因此可以构建一个解释器,该解释器通过解释这些句子来解决这些问题.解释器模式描述了如何构成一个简单的语言解释器,主要应用在使用面向对象语言开发的编译器中. 模式定义解释器模式(Interpreter Pattern) :定义语言的文法,并且建立一个解释器来解释该语言中的句子,这里的“语言”意思是使用规定格式和语法的代码,它是一种类行为型模式.Interpreter Pattern: Give