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

概述:

GOF定义:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

在软件开发特别是DSL开发中常常需要使用一些相对较复杂的业务语言,如果业务语言使用频率足够高,且使用普通的编程模式来实现会导致非常复杂的变化,那么就可以考虑使用解释器模式构建一个解释器对复杂的业务语言进行翻译。

这种做法虽然效率相对较低,但可以允许用户使用自定义的业务语言来处理逻辑,因此在效率不是关键问题的场合还是较为有用的。

1. context:包含解释器之外的一些全局信息。解释器上下文环境类,用来存储解释器的上下文环境,比如需要解释的文法等。

2. 终结符表达式角色:具体表达式。实现与文法中的终结符相关联的解释操作。句子中的每个终结符需要该类的一个实例与之对应。

3. 非终结符表达式角色:具体表达式。文法中的每条规则R=R1R2…Rn都需要一个非终结符表达式角色。对于从R1到Rn的每个符号都维护一个抽象表达式角色的实例变量。实现解释操作,解释一般要递归地调用表示从R1到Rn的那些对象的解释操作。

4. 客户角色:构建(或者被给定)表示该文法定义的语言中的一个特定的句子的抽象语法树,调用解释操作。

  举一个加减乘除运算解释器例子,代码如下:

1.Context 类:

 public class Context
    {
        //private Dictionary<string, int> dic = new Dictionary<string, int>();

        //public void AddValue(string variable, int value)
        //{
        //    dic.Add(variable, value);
        //}

        //public int GetValue(string variable)
        //{
        //    if (dic.ContainsKey(variable))
        //    {
        //        return dic[variable];
        //    }
        //    return 0;
        //}
    }

因为我后续没有用到,就把这里面的代码注释掉了,这里可以根据需要在增加代码,一般用例储存上下文的环境等。

2.接口Expression

  public interface Expression
    {
        int Interpreter(Context ctx);
    }

3.变量表达式 Variable

 public class Variable : Expression
    {
        public int value { get; set; }
        public Variable(int value)
        {
            this.value = value;
        }

        public int Interpreter(Context ctx)
        {
            return this.value;
        }
    }

4.常量表达式

    //常量
    public class ConstantExpression : Expression
    {
        private int i;
        public ConstantExpression(int i)
        {
            this.i = i;
        }
        public int Interpreter(Context ctx)
        {
            return i;
        }
    }

5.增加表达式

    public class AddExprestion : Expression
    {
        private Expression left, right;
        public AddExprestion(Expression left, Expression right)
        {
            this.left = left;
            this.right = right;
        }

        public int Interpreter(Context ctx)
        {
            return left.Interpreter(ctx) + right.Interpreter(ctx);
        }
    }

6.减法表达式

    public class SubtractExprestion : Expression
    {
        private Expression left, right;
        public SubtractExprestion(Expression left, Expression right)
        {
            this.left = left;
            this.right = right;
        }

        public int Interpreter(Context ctx)
        {
            return left.Interpreter(ctx) - right.Interpreter(ctx);
        }
    }

7. 测试运行

 static void Main(string[] args)
        {

            Context ctx = new Context();
            Variable a = new Variable(1);
            Variable b = new Variable(2);

            Expression addExp = new SubtractExprestion(new ConstantExpression(10), new AddExprestion(b, a));
            int result = addExp.Interpreter(ctx);
            Console.WriteLine("result=(10-(1+2))=" + result);
        }

  8. 运行结果

最后,用过C#就知道里面的LambdaExpression 设计思想是解释器模式最好的解释。

时间: 2024-12-28 01:08:36

设计模式-解释器模式(行为模式)的相关文章

设计模式——介绍与工厂模式(扁平管理模式VS职业经理人模式)

本文主要对设计模式进行大概解说.特别是对工厂模式进行简明的解析: 一.设计模式的分类 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.訪问者模式.中介者模式.解释器模式. 事实上还有两类:并发型模式和线程池模式. 二.设计模式的六大原则 1.开闭原则(Op

设计模式之中介者模式(Mediator)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

设计模式-行为型模式-策略模式

策略模式 在实际工作中我用到了策略模式,但为什么要有环境角色呢? 这里我贴上英文对含义的介绍, The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it. 然后看看这种设计模式的组成, 一般的,策略模式

设计模式之行为类模式大PK

                                    行为类模式大PK 行为类模式包括责任链模式.命令模式.解释器模式.迭代器模式.中介者模式.备忘录模式.观察者模式.状态模式.策略模式.模板方法模式.访问者模式.该组设计模式众多,如下我们着重介绍一下命令模式VS策略模式.状态模式VS策略模式.观察者模式VS责任链模式. 命令模式VS策略模式 命令模式和策略模式类图很相似,只是命令模式多了一个接收者(Receiver)角色,通过确切的Command类调用Receiver类,实现

设计模式之职责链模式(Chain of Responsibility)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化托付给还有一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些详细的类的信息封装起来.第二,它们隐藏了这些类的实例是怎样被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,

设计模式之享元模式(Flyweight)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化托付给还有一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些详细的类的信息封装起来.第二,它们隐藏了这些类的实例是怎样被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,

Java经典23种设计模式之行为型模式(一)

行为型设计模式有11种,分别是Chain of Responsibility ( 责任链模式 ).Command ( 命令模式 ).Interpreter ( 解释器模式 ) .Iterator ( 迭代器模式 ).Mediator ( 中介者模式 ) .Memento ( 备忘录模式 ) .Observer ( 观察者模式 ).State ( 状态模式 ) .Strategy ( 策略模式 ).TemplateMethod ( 模板方法 ).Visitor ( 访问者模式 ),本文介绍这11种

java设计模式--行为型模式--迭代模式

1 迭代器模式 2 概述 3 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 4 5 6 适用性 7 1.访问一个聚合对象的内容而无需暴露它的内部表示. 8 9 2.支持对聚合对象的多种遍历. 10 11 3.为遍历不同的聚合结构提供一个统一的接口(即,支持多态迭代). 12 13 14 参与者 15 1.Iterator 16 迭代器定义访问和遍历元素的接口. 17 18 2.ConcreteIterator 19 具体迭代器实现迭代器接口.

php设计模式(二):结构模式

上一篇我们介绍了设计模式的特性并且详细讲解了4种创建型模式,创建型模式是负责如何产生对象实例的,现在我们继续来给大家介绍结构型模式.一.什么是结构型模式? 结构型模式是解析类和对象的内部结构和外部组合,通过优化程序结构解决模块之间的耦合问题. 二.结构型模式的种类:    适配器模式    桥接模式    装饰模式    组合模式    外观模式    享元模式    代理模式 1. 适配器模式(Adapter) 将一个类的接口转换成客户希望的另一个接口,适配器模式使得原本的由于接口不兼容而不能

设计模式3—行为型模式

行为型模式用来对类或对象怎样交互和怎样分配职责进行描述,主要包含以下11种设计模式: 1. 模板方法模式(Template Method Pattern)使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 2. 命令模式(Command Pattern)是将一个请求封装为一个对象,从而使你可用不同的请求对客户端进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作. 3. 责任链模式(Chain of Responsibility Pattern),在该模式里,很多对象由每一个