InterpreterPattern

意图
给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的句子.

 

比如说对任何一种语言,已经把它语法的解释都已经解释出来了,接着这个语言的任何一个句子我都可以对它进行解释.

 

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

 

构成:
1.抽象表达式角色:声明一个所有的具体表达式角色都需要实现的抽象接口.这个接口主要是一个Interpreter()方法,称作解释操作.


2.终结符表达式角色:这是一个具体角色
--实现了抽象表达式角色所要求的接口,主要是一个Interpret()方法.
--文法中的每一个终结符都有一个具体终结表达式与之相对应.


3.非终结符表达式:这是一个具体角色
--实现了抽象表达式角色所要求的接口,主要是一个Interpret()方法
--解释操作以递归方式进行调用
(非终结符表达式可以包含若干个终结符表达式,就像一个枝节点可以包含若干个叶节点,两者之间是一种一对多的关系,非终结符表达式可以递归调用终结符表达式,还有一种情况就是非终结符表达式里面还可以包含若干个终结符表达式.)


4.环境角色:提供解释器之外的一些全局信息(对解释器提供额外的操作等)


5.客户端角色:调用解释操作Interpret.

 

 

对于一个布尔表达式它有多种可能,比如说:我们可以定义一个常量true或false,另外定义一个变量,这个变量可以稍后给它赋值,先定义好变量,具体值是什么可以最后给它赋上,并且还可以去改变它的值,还可以定义布尔表达式的与&&操作,或||操作,非!操作.

我们可以模拟一个具体的表达式,这个表达式就是一个布尔表达式,它可能是多个布尔表达式组成的一个整体,然后最终我们求得这个结果,里面肯定要涉及到若干的表达式的与,或,非,这里的每个操作都涉及到一个解释,比如两个bool表达式它们进行操作的时候,这就是一种解释器的行为,我们可以将这里面每种可能出现的情况都把它提取出来,作为我们的终结符表达式,比如说我们定义了与&&这样一个操作,那么这样就形成两个布尔表达式,它们具体结果是真还是假,我们是在终结符表达式里面执行的判断.

 

(图片看不清可点击得到图片原始大小)

ClassDiagram:

 

 

SequenceDiagram:

当调用非终结符表达式的时候,它又可以去调用它所包含的其他的非终结符表达式以及终结符表达式,通过这样一个递归的调用关系就实现了不断的解释这样一个过程.

  

 InterpreterPattern示例意图:

解释布尔表达式的解释器,布尔表达式有多种情况比如:常量和常量,变量和变量,常量和变量, 相应的还有与(&&),或(||)非(!)几种操作,要把它们都实现出来,因此我要定义一个常量,一个变量,再去定义与And,或Or,非Not,这样几种操作,然后给出一个复杂的布尔表达式,通过所提供的解释器对给出复杂的布尔表达式进行解释,然后获得我想要的结果.

 

class Client
    {
        static void Main(string[] args)
        {
            Context context = new Context();

            Variable x = new Variable("x");
            Variable y = new Variable("y");

            Constant c = new Constant(true);

            context.Assign(x, false);
            context.Assign(y, true);

            Expression exp = new Or(new And(c, x), new And(y, new Not(x)));

            Console.WriteLine("x={0}", x.Interpret(context));

            Console.WriteLine("y={0}", y.Interpret(context));

            Console.WriteLine("exp={0}", exp.Interpret(context));

            Console.ReadKey();
        }
    }

    /// <summary>
    /// 抽象表达式角色
    /// </summary>
    public abstract class Expression
    {
        //抽象表达式角色依赖与环境角色来进行相应的解释.
        public abstract bool Interpret(Context context);
    }

    /// <summary>
    /// 环境角色
    /// </summary>
    public class Context
    {
        //环境角色主要提供一些全局性的操作(通用的操作).
        //该例子定义的通用性的操作:定义一个变量给变量赋值,查找变量值.
        private Hashtable table = new Hashtable();

        /*通过客户端定义变量给相应的变量赋值存放在HashTable里.
         * 该变量只有两种可能true和false; */
        public void Assign(Variable var, bool value)
        {
            table.Add(var, value);
        }

        //取出变量的值.
        public bool Lookup(Variable var)
        {
            return (Boolean)table[var];
        }
    }

    /// <summary>
    /// 终结符表达式角色
    /// </summary>
    public class Variable : Expression
    {
        //该类定义了一个变量
        /*它里面只能定义true和false所以它是一个
        终结符表达式.*/
        private string name;

        public Variable(string s)
        {
            name = s;
        }

        public override bool Interpret(Context context)
        {
            return context.Lookup(this);
        }
    }

    /// <summary>
    /// 终结符表达式角色
    /// </summary>
    class Constant : Expression
    {
        //该类定义了一个常量
        /*它里面只能定义true和false所以它是一个
        终结符表达式.*/
        bool value;

        public Constant(bool v)
        {
            value = v;
        }

        public override bool Interpret(Context context)
        {
            return value;
        }

    }

    /// <summary>
    /// 非终结符表达式
    /// </summary>
    class And : Expression
    {
        //该类定义与(&&)的操作
        /*非终结符表达式它里面会包含
        若干个非终结符表达式及终结符表达式*/

        Expression left;
        Expression right;

        public And(Expression l, Expression r)
        {
            left = l;
            right = r;
        }

        public override bool Interpret(Context context)
        {
            return left.Interpret(context) && right.Interpret(context);
        }

    }

    /// <summary>
    /// 非终结符表达式
    /// </summary>
    class Or : Expression
    {
        //该类定义与(||)的操作
        /*非终结符表达式它里面会包含
        若干个非终结符表达式及终结符表达式*/

        Expression left;
        Expression right;

        public Or(Expression l, Expression r)
        {
            left = l;
            right = r;
        }

        public override bool Interpret(Context context)
        {
            return left.Interpret(context) || right.Interpret(context);
        }
    }

    /// <summary>
    /// 非终结符表达式
    /// </summary>
    class Not : Expression
    {
        //该类定义与(||)的操作,
        /*该类可包含一个终结符表达式或
       非终结符表达式所以它是非终结符表达式*/

        Expression exp;

        public Not(Expression e)
        {
            exp = e;
        }

        public override bool Interpret(Context context)
        {
            return !exp.Interpret(context);
        }
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内容介绍 项目结构: Controller层:使用Spring MVC来处理用户请求,负责将请求分发到相应的业务逻辑层,并将数据传递给视图层进行展示。Controller层通常包含控制器类,这些类通过注解如@Controller、@RequestMapping等标记,负责处理HTTP请求并返回响应。 Service层:Spring的核心部分,用于处理业务逻辑。Service层通过接口和实现类的方式,将业务逻辑与具体的实现细节分离。常见的注解有@Service和@Transactional,后者用于管理事务。 DAO层:使用MyBatis来实现数据持久化,DAO层与数据库直接交互,执行CRUD操作。MyBatis通过XML映射文件或注解的方式,将SQL语句与Java对象绑定,实现高效的数据访问。 Spring整合: Spring核心配置:包括Spring的IOC容器配置,管理Service和DAO层的Bean。配置文件通常包括applicationContext.xml或采用Java配置类。 事务管理:通过Spring的声明式事务管理,简化了事务的处理,确保数据一致性和完整性。 Spring MVC整合: 视图解析器:配置Spring MVC的视图解析器,将逻辑视图名解析为具体的JSP或其他类型的视图。 拦截器:通过配置Spring MVC的拦截器,处理请求的预处理和后处理,常用于权限验证、日志记录等功能。 MyBatis整合: 数据源配置:配置数据库连接池(如Druid或C3P0),确保应用可以高效地访问数据库。 SQL映射文件:使用MyBatis的XML文件或注解配置,将SQL语句与Java对象映射,支持复杂的查询、插入、更新和删除操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值