原文:乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern)

[索引页][源码下载]

乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern)

作者:webabcd





介绍

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





示例

有一个Message实体类,某个类对它的操作有Get()方法。现在要求用具有某一规则的中文语法来执行这个操作。







MessageModel

using System;

using System.Collections.Generic;

using System.Text;



namespace Pattern.Interpreter

{

    /**//// <summary>

    /// Message实体类

    /// </summary>

    public class MessageModel

    {

        /**//// <summary>

        /// 构造函数

        /// </summary>

        /// <param name="msg">Message内容</param>

        /// <param name="pt">Message发布时间</param>

        public MessageModel(string msg, DateTime pt)

        {

            this._message = msg;

            this._publishTime = pt;

        }



        private string _message;

        /**//// <summary>

        /// Message内容

        /// </summary>

        public string Message

        {

            get { return _message; }

            set { _message = value; }

        }



        private DateTime _publishTime;

        /**//// <summary>

        /// Message发布时间

        /// </summary>

        public DateTime PublishTime

        {

            get { return _publishTime; }

            set { _publishTime = value; }

        }

    }

}

SqlMessage

using System;

using System.Collections.Generic;

using System.Text;



namespace Pattern.Interpreter

{

    /**//// <summary>

    /// Sql方式操作Message

    /// </summary>

    public class SqlMessage

    {

        /**//// <summary>

        /// 获取Message

        /// </summary>

        /// <returns></returns>

        public static List<MessageModel> Get()

        {

            List<MessageModel> l = new List<MessageModel>();

            l.Add(new MessageModel("SQL方式获取Message", DateTime.Now));



            return l;

        }

    }

}

Context

using System;

using System.Collections.Generic;

using System.Text;



namespace Pattern.Interpreter

{

    /**//// <summary>

    /// Context

    /// </summary>

    public class Context

    {

        private string _input;

        private string _output;



        /**//// <summary>

        /// 构造函数

        /// </summary>

        /// <param name="input">输入内容</param>

        public Context(string input)

        {

            this._input = input;

        }



        /**//// <summary>

        /// 输入内容

        /// </summary>

        public string Input

        {

            get { return _input; }

            set { _input = value; }

        }



        /**//// <summary>

        /// 输出内容

        /// </summary>

        public string Output

        {

            get { return _output; }

            set { _output = value; }

        }

    }

}

AbstractExpression

using System;

using System.Collections.Generic;

using System.Text;



namespace Pattern.Interpreter

{

    /**//// <summary>

    /// 抽象公式(AbstractExpression)

    /// </summary>

    public abstract class AbstractExpression

    {

        /**//// <summary>

        /// 解释Context的方法

        /// </summary>

        /// <param name="context">context</param>

        public void Interpret(Context context)

        {

            if (String.IsNullOrEmpty(context.Input))

            {

                return;

            }



            context.Output += GetCSharp(context.Input);

        }



        /**//// <summary>

        /// 获得输入内容所对应的C#代码

        /// </summary>

        /// <param name="source">source</param>

        /// <returns></returns>

        private string GetCSharp(string source)

        {

            string csharp = "";

            string word = "";



            // 从输入内容中取得要解释的词

            word = GetWord(source);



            // 从字典中找到word所对应的C#代码

            GetDictionary().TryGetValue(word, out csharp);



            return csharp;

        }



        /**//// <summary>

        /// 从输入内容中取得要解释的词

        /// </summary>

        /// <param name="source">source</param>

        /// <returns></returns>

        public abstract string GetWord(string source);



        /**//// <summary>

        /// 获取字典

        /// </summary>

        /// <returns></returns>

        public abstract Dictionary<string, string> GetDictionary();

    }

}

DatabaseExpression

using System;

using System.Collections.Generic;

using System.Text;



using System.Text.RegularExpressions;



namespace Pattern.Interpreter

{

    /**//// <summary>

    /// 终端公式(TerminalExpression)分析与数据库相关的

    /// </summary>

    public class DatabaseExpression : AbstractExpression

    {

        /**//// <summary>

        /// 从输入内容中取得要解释的词

        /// </summary>

        /// <param name="source">source</param>

        /// <returns></returns>

        public override string GetWord(string source)

        {

            MatchCollection mc;

            Regex r = new Regex(@"\{(.*)\}");

            mc = r.Matches(source);



            ].Value;

        }



        /**//// <summary>

        /// 获取与数据库相关的字典

        /// </summary>

        /// <returns></returns>

        public override Dictionary<string, string> GetDictionary()

        {

            Dictionary<string, string> d = new Dictionary<string, string>();



            d.Add("数据库", "Sql");



            return d;

        }

    }

}

ObjectExpression

using System;

using System.Collections.Generic;

using System.Text;



using System.Text.RegularExpressions;



namespace Pattern.Interpreter

{

    /**//// <summary>

    /// 终端公式(TerminalExpression)分析与对象相关的

    /// </summary>

    public class ObjectExpression : AbstractExpression

    {

        /**//// <summary>

        /// 从输入内容中取得要解释的词

        /// </summary>

        /// <param name="source">source</param>

        /// <returns></returns>

        public override string GetWord(string source)

        {

            MatchCollection mc;

            Regex r = new Regex(@"\[(.*)\]");

            mc = r.Matches(source);



            ].Value;

        }



        /**//// <summary>

        /// 获取与对象相关的字典

        /// </summary>

        /// <returns></returns>

        public override Dictionary<string, string> GetDictionary()

        {

            Dictionary<string, string> d = new Dictionary<string, string>();



            d.Add("信息", "Message");



            return d;

        }

    }

}

MethodExpression

using System;

using System.Collections.Generic;

using System.Text;



using System.Text.RegularExpressions;



namespace Pattern.Interpreter

{

    /**//// <summary>

    /// 终端公式(TerminalExpression)分析与方法相关的

    /// </summary>

    public class MethodExpression : AbstractExpression

    {

        /**//// <summary>

        /// 从输入内容中取得要解释的词

        /// </summary>

        /// <param name="source">source</param>

        /// <returns></returns>

        public override string GetWord(string source)

        {

            MatchCollection mc;

            Regex r = new Regex(@"\((.*)\)");

            mc = r.Matches(source);



            ].Value;

        }



        /**//// <summary>

        /// 获取与方法相关的字典

        /// </summary>

        /// <returns></returns>

        public override Dictionary<string, string> GetDictionary()

        {

            Dictionary<string, string> d = new Dictionary<string, string>();



            d.Add("获取", ".Get()");



            return d;

        }

    }

}

client

using System;

using System.Data;

using System.Configuration;

using System.Collections;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;



using Microsoft.CSharp;

using System.Reflection;

using System.Text;

using System.Collections.Generic;



using Pattern.Interpreter;



public partial class Interpreter : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

        string chinese = "{数据库}[信息](获取)";

        Context context = new Context(chinese);



        List<AbstractExpression> l = new List<AbstractExpression>();

        l.Add(new DatabaseExpression());

        l.Add(new ObjectExpression());

        l.Add(new MethodExpression());



        foreach (AbstractExpression exp in l)

        {

            exp.Interpret(context);

        }



        Assembly assembly = Assembly.Load("Pattern.Interpreter");

        MethodInfo method ].Replace("()", ""));

        object obj = method.Invoke(null, null);



        List<MessageModel> m = (List<MessageModel>)obj;



        Response.Write("中文语法:" + chinese);

        Response.Write("<br />");

        Response.Write("解释后的C#代码:" + context.Output);

        Response.Write("<br />");

        Response.Write(].PublishTime.ToString());

    }

}

运行结果

中文语法:{数据库}[信息](获取)

解释后的C#代码:SqlMessage.Get()

执行结果:SQL方式获取Message 2007-5-1 8:48:07





参考

http://www.dofactory.com/Patterns/PatternInterpreter.aspx





OK

[源码下载]

乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern)的更多相关文章

  1. C#设计模式:解释器模式(Interpreter Pattern)

    一,C#设计模式:解释器模式(Interpreter Pattern) 1,解释器模式的应用场合是Interpreter模式应用中的难点,只有满足“业务规则频繁变化,且类似的模式不断重复出现,并且容易 ...

  2. 二十四种设计模式:解释器模式(Interpreter Pattern)

    解释器模式(Interpreter Pattern) 介绍给定一个语言, 定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子. 示例有一个Message实体类,某个类对它的 ...

  3. 乐在其中设计模式(C#) - 提供者模式(Provider Pattern)

    原文:乐在其中设计模式(C#) - 提供者模式(Provider Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 提供者模式(Provider Pattern) 作者:weba ...

  4. 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern)

    原文:乐在其中设计模式(C#) - 访问者模式(Visitor Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern) 作者:webabc ...

  5. 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)

    原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...

  6. 乐在其中设计模式(C#) - 状态模式(State Pattern)

    原文:乐在其中设计模式(C#) - 状态模式(State Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 状态模式(State Pattern) 作者:webabcd 介绍 允 ...

  7. 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern)

    原文:乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) 作者:webabc ...

  8. 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern)

    原文:乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) 作者:weba ...

  9. 乐在其中设计模式(C#) - 命令模式(Command Pattern)

    原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...

随机推荐

  1. JavaScript 中的事件流和事件处理程序(读书笔记思维导图)

    JavaScript 程序采用了异步事件驱动编程模型.在这种程序设计风格下,当文档.浏览器.元素或与之相关的对象发生某些有趣的事情时,Web 浏览器就会产生事件(event). JavaScript ...

  2. [cocos2d-x]屏幕自适应解决的方法

    近期在写一个项目,要求pc,ipad,andriod平台上都能够执行,所以选择用cocos2d-x来开发. 我们的资源大小是1024*768的,在pc上和苹果上都是没有问题的,但是到了andriod上 ...

  3. Everything You Wanted to Know About Machine Learning

    Everything You Wanted to Know About Machine Learning 翻译了理解机器学习的10个重要的观点,增加了自己的理解.这些原则在大部分情况下或许是这样,可是 ...

  4. ipv6加英文的中括号访问

    加英文的中括号就可以,如[2001:4998:c:e33::1004],我发现这是yahoo首页.但并不是所有IPv6网站都可以通过IPv6地址访问,跟IPv4一样,网站服务器端可以只绑定域名,不接受 ...

  5. Indiegogo: An International Crowdfunding Platform to Raise Money

    Indiegogo: An International Crowdfunding Platform to Raise Money The world's funding platform. Fund ...

  6. (转)ikvmc的使用

    IKVM.NET是一个针对Mono和微软.net框架的java实现,其设计目的是在.NET平台上运行java程序.本文将比较详细的介绍这个工具的原理.使用入门(如何java应用转换为.NET应用.), ...

  7. Berkeley DB 使用

    http://www.ibm.com/developerworks/cn/linux/l-embdb/index.html UNIX/LINUX平台下的数据库种类非常多,参考资料1中 列举了其中的大部 ...

  8. PSU 离11.2.0.3.0 -&gt; 11.2.0.3.11 如果解决冲突的整个

    Oracle rdbms 扑灭psu离11.2.0.3.0升级到11.2.0.3.11 参考patch :18522512 停止应用,停止听音乐并DB,将db的oracle_home在下面OPatch ...

  9. A Game of Thrones(0) - PROLOGUE

    "We should start back", Gared urged as the woods began to grow dark around them. "The ...

  10. ZOJ 3822 Domination(概率dp 牡丹江现场赛)

    题目链接:problemId=5376">http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5376 Edward ...