解释器模式学习总结

目录

 

解释器模式

引言

定义

模式结构图

实例

实例说明

实例类图

代码实现

总结

模式优点

模式缺点


解释器模式

引言

解释器模式主要使用于面向对象语言开发的编译器和解释器设计,平时不常使用。在某些情况下,为了更好地描述某一些特定的问题,可以创建一个新的语言,这个语言拥有自己的表达式和结构,即语法规则,而且可以根据需要灵活的增加新的语法规则。

定义

英文定义:“Given a language,define a representation for its grammar along with an interpreter that use the representation to interpret sentences in the language.”。

中文定义:定义语言的文法,并且建立一个解释器来解释该语言中的句子。

                                       解释器模式重要等级★☆☆☆☆         解释器模式难度等级★★★★☆

模式结构图

解释器模式包含如下角色。

1)AbstractExpression(抽象表达式)

2)TerminalExpression(终结符表达式)

终结符表达式是抽象表达式的子类,它实现了文法中的终结符相关联的解释操作,在句子中的每一个终结符都是该类的一个实例。通常在一个解释器模式中只有少数几个终结符表达式类,它们的实例可以通过非终结符表达式组成较复杂的句子。

3)NonTerminalExpression(非终结符表达式)

非终结符表达式是抽象表达式的子类,它实现了文法中非终结符的解释操作。由于非终结符表达式中可以包含终结符表达式,也可以继续包含非终结符表达式,因此其解释操作一般通过递归方式来完成。

4)Interpreter(解释器封装类)

该类中构造了表示该文法的语言中一个特定句子的抽象语法树,该抽象语法树由非终结符表达式和终结表达式实例组合而言。改类中调用解释操作,实现对句子的解释。

实例

实例说明

使用解释器模式设计一个简单的加法/减法解释器。

实例类图

代码实现

1)抽象节点类Node

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


interface Node
{
    int Interpret();
}

2)  终结符表达式ValueNode

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


class ValueNode : Node
{
    private int value;

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

3) 非终结符表达式SymbolNode

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


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();
}

4)AddNode

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


class AddNode : SymbolNode
{
    public AddNode(Node left, Node right) : base(left, right) { }
    public override int Interpret()
    {
        return left.Interpret() + right.Interpret();
    }
}

5) SubtractNode

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


class SubtractNode : SymbolNode
{
    public SubtractNode(Node left,Node right) : base(left, right) { }
    public override int Interpret()
    {
        return left.Interpret() - right.Interpret();
    }
}

6) Calculator

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


class Calculator
{
    private Node node;
    public int Compute(string statement)
    {
        BuildTree(statement);
        return node.Interpret();
    }

    private void BuildTree(string statement)
    {
        Node left, right;
        Stack<Node> nodes = new Stack<Node>();
        string[] arr = statement.Split(' ');

        for(int i = 0; i < arr.Length; i++)
        {
            string v = arr[i];
            if (v.Equals("+"))
            {
                left = nodes.Pop();
                right = new ValueNode(Convert.ToInt16(arr[++i]));
                nodes.Push(new AddNode(left, right));
            }
            else if (v.Equals("-"))
            {
                left = nodes.Pop();
                right = new ValueNode(Convert.ToInt16(arr[++i]));
                nodes.Push(new SubtractNode(left, right));
            }
            else
            {
                nodes.Push(new ValueNode(Convert.ToInt16(v)));
            }
        }

        node = nodes.Pop();
    }
}

测试代码

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        Calculator caculator = new Calculator();
        string formula = Console.ReadLine();
        Console.WriteLine(formula + " = " + caculator.Compute(formula));
        Console.ReadKey();
    }
}

运行截图

总结

模式优点

1)易于改变和扩展文法。由于解释器模式使用类来表示语言的文法规则,因此可以通过继承机制来改变或者扩展文法。

2)易于实现文法。在抽象语法树中每一个节点类的实现方式都是相似的,这些类的编写都不是很复杂。

3)增加了新的解释表达式的方式。解释器模式可以让用户较为方便地增加新类型的表达式,增加新的表达式时无需对现有表达式进行修改,符合“开闭原则”。

模式缺点

1)对于复杂文法难以维护。在解释器模式中,每一条规则至少需要定义一个类,因此如果一个语言包含太多文法规则,则可能难以管理和维护。

2) 执行效率低。因为解释器模式中使用了大量的递归和循环调用。

3)应用场景有限,在实际开发中很少需要自定义文法规则。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 设计模式(Design Patterns)是一种面向对象的编程思想,是用来解决常见问题的可重用解决方案,因此能够提高代码的可维护性、可扩展性。 《设计模式:可复用面向对象软件的基础》是一本介绍设计模式的经典书籍。该书首次提出了“23种设计模式”,它们被分为三大类:创建型模式、结构型模式和行为型模式。这些模式是经过多年软件开发实践的总结,具有实际效用和可靠性。 其中,创建型模式包括单例模式、工厂模式、抽象工厂模式、建造者模式和原型模式,主要用于处理对象的创建问题;结构型模式包括适配器模式、桥接模式、组合模式、装饰者模式、外观模式、享元模式和代理模式,主要用于处理类或对象的组合问题,从而形成更大的结构;行为型模式包括责任链模式、命令模式解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式,主要用于处理对象间的通信、控制、操作和管理。 使用设计模式可以加速软件开发进程,减少错误和重复工作。但需要注意的是,设计模式并不是万能的,它们应该被看作是一种建议,而不是规则,要根据自己的需求选择合适的模式。同时,设计模式也需要在团队中学习和使用,才能真正发挥出优秀的效果。 ### 回答2: 设计模式(Design Pattern)指的是在软件设计领域中经过多次实践并被广泛验证验证的一些通用的解决问题的方法和思想,是一些可复用的面向对象设计经验的总结和提炼。 《设计模式》是由四位著名软件工程师所写的一本经典著作,该书提出了23种常用的设计模式,分为创建型模式、结构型模式和行为型模式三类。这些模式不仅可以解决软件开发过程中的一些常见问题,同时还可以提高软件的可维护性、可扩展性和可重用性,从而提高软件开发的效率和质量。 在设计模式学习过程中,不仅需要掌握各种设计模式的定义和应用场景,还需要理解面向对象的设计原则和思想,如开闭原则、单一职责原则、依赖倒置原则、里氏替换原则等等。只有掌握了这些基本的面向对象设计原则,才能更好地理解和应用设计模式,从而提高软件设计的水平和效果。 总之,设计模式是软件开发过程中不可忽视的重要工具和思想,对于软件工程师而言,学习和掌握设计模式是必不可少的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值