码迷,mamicode.com
首页 > 其他好文 > 详细

解释器模式

时间:2020-01-14 09:21:24      阅读:90      评论:0      收藏:0      [点我收藏+]

标签:static   contains   pat   ext   end   规则   console   解析   ring   

解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。

优点: 1、可扩展性比较好,灵活。 2、增加了新的解释表达式的方式。 3、易于实现简单文法。

缺点: 1、可利用场景比较少。 2、对于复杂的文法比较难维护。 3、解释器模式会引起类膨胀。 4、解释器模式采用递归调用方法。

使用场景: 1、可以将一个需要解释执行的语言中的句子表示为一个抽象语法树。 2、一些重复出现的问题可以用一种简单的语言来进行表达。 3、一个简单语法需要解释的场景。

 

解释器模式感觉应用的场景非常少,杰杰暂时也想不到什么好的案例,拿菜鸟教程的例子作为案例,书写一下解释器模式

实现

我们将创建一个接口 Expression 和实现了 Expression 接口的实体类。定义作为上下文中主要解释器的 TerminalExpression 类。其他的类 OrExpressionAndExpression 用于创建组合式表达式。

InterpreterPatternDemo,我们的演示类使用 Expression 类创建规则和演示表达式的解析。

 技术图片

  #region 解释器需要的公共方法接口
    public interface Expression
    {
        bool interpret(String context);
    }
  #region 解释器实现类
    public class TerminalExpression : Expression
    {
        private String data;

        public TerminalExpression(String data)
        {
            this.data = data;
        }

        public bool interpret(string context)
        {
            if (context.Contains(data))
            {
                return true;
            }
            return false;
        }
    }
    public class OrExpression : Expression
    {
        private Expression expr1 = null;
        private Expression expr2 = null;

        public OrExpression(Expression expr1, Expression expr2)
        {
            this.expr1 = expr1;
            this.expr2 = expr2;
        }


        public bool interpret(string context)
        {
            return expr1.interpret(context) || expr2.interpret(context);
        }
    }
    public class AndExpression : Expression
    {
        private Expression expr1 = null;
        private Expression expr2 = null;

        public AndExpression(Expression expr1, Expression expr2)
        {
            this.expr1 = expr1;
            this.expr2 = expr2;
        }


        public bool interpret(string context)
        {
            return expr1.interpret(context) || expr2.interpret(context);
        }
    }
    #endregion
  static void Main(string[] args)
        {
            //构建好了解释器,使用解释器接口规则进行创建
            Expression isMale = getMaleExpression();
            Expression isMarriedWoman = getMarriedWomanExpression();

            Console.WriteLine("{0} is male?" + isMale.interpret("Robert"), "Robert");
            Console.WriteLine("{0} is male?" + isMarriedWoman.interpret("Julie"), "Julie");
            Console.ReadKey();
        }
        #region 解释器方法
        //规则:Robert 和 John 是男性
        public static Expression getMaleExpression()
        {
            Expression robert = new TerminalExpression("Robert");
            Expression john = new TerminalExpression("John");
            return new OrExpression(robert, john);
        }
        //规则:Julie 是一个已婚的女性
        public static Expression getMarriedWomanExpression()
        {
            Expression julie = new TerminalExpression("Julie");
            Expression married = new TerminalExpression("Married");
            return new AndExpression(julie, married);
        }
        #endregion
    }

 技术图片

解释器模式

标签:static   contains   pat   ext   end   规则   console   解析   ring   

原文地址:https://www.cnblogs.com/ningxinjie/p/12190177.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!