Atitit.linq java的原理与实现 解释器模式

1. Linq  from  where 的实现1

2. Where expr 的实现1

3. Attilax的一点变化2

4. 解释器模式的结构2

5. Code3

5.1. EqExpression3

5.2. LikeExpression4

5.3. AndExpression4

5.4. AExpression5

6. 参考5

1. Linq  from  where 的实现

Map row= from(ColumnsDefs).where(eq("COLUMN_NAME", key)).exe().get(0);

2. Where expr 的实现

大概有15个expr。。。  关系(大小比较),逻辑expr。。。In like 等。。

作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 汉字名:艾龙,  EMAIL:1466519819@qq.com

转载请注明来源: http://www.cnblogs.com/attilax/

3. Attilax的一点变化

没使用终结符号的概念..两个数据类型..express类型,common data..

要是express类型..就是可以计算的express...  贝儿走普通的数据..

Note::checkSuitOk should  use  interpreter

4. 解释器模式的结构

· 抽象解释器:声明一个所有具体表达式都要实现的抽象接口(或者抽象类),接口中主要是一个interpret()方法,称为解释操作。具体解释任务由它的各个实现类来完成,具体的解释器分别由终结符解释器TerminalExpression和非终结符解释器NonterminalExpression完成。

· 终结符表达式:实现与文法中的元素相关联的解释操作,通常一个解释器模式中只有一个终结符表达式,但有多个实例,对应不同的终结符。终结符一半是文法中的运算单元,比如有一个简单的公式R=R1+R2,在里面R1和R2就是终结符,对应的解析R1和R2的解释器就是终结符表达式。

· 非终结符表达式:文法中的每条规则对应于一个非终结符表达式,非终结符表达式一般是文法中的运算符或者其他关键字,比如公式R=R1+R2中,+就是非终结符,解析+的解释器就是一个非终结符表达式。非终结符表达式根据逻辑的复杂程度而增加,原则上每个文法规则都对应一个非终结符表达式。

仅有两类元素:运算元素和运算符号,运算元素就是指a、b、c等符号,需要具体赋值的对象,也叫做终结符号,为什么叫终结符号呢?因为这些元素除了需要赋值外,不需要做任何处理,所有运算元素都对应一个具体的业务参数,这是语法中最小的单元逻辑,不可再拆分;运算符号就是加减符号,需要我们编写算法进行处理,每个运算符号都要对应处理单元,否则公式无法运行,运算符号也叫做非终结符号

们就可以先画一个简单的类图,如图27-1所示。

5. Code

5.1. EqExpression

package com.attilax.linq;

import java.util.Map;

public class EqExpression extends AExpression {

public EqExpression(String leftCol, Object ritVal) {

this.left=leftCol;

this.rit=ritVal;

}

public boolean interpreter(Map row) {

//LikeExpression le=(LikeExpression) whereExpressAst;

if(row.get(this.left.toString()).toString().equals(this.rit.toString()))

return true;

else

return false;

}

5.2. LikeExpression

package com.attilax.linq;

import java.util.Map;

public class LikeExpression extends AExpression{

public LikeExpression(String col, String val) {

this.left=col;

this.rit=val;

}

public boolean checkSuitOk(Map row) {

//LikeExpression le=(LikeExpression) whereExpressAst;

if(row.get(this.left.toString()).toString().contains(this.rit.toString()))

return true;

else

return false;

}

}

5.3. AndExpression

package com.attilax.linq;

import java.util.Map;

public class AndExpression extends AExpression {

public AndExpression(AExpression whereExpressAst, AExpression eq) {

this.left=whereExpressAst;

this.rit=eq;

}

public boolean checkSuitOk(Map row) {

//LikeExpression le=(LikeExpression) whereExpressAst;

AExpression lft_exp=(AExpression) this.left;

AExpression rit_exp=(AExpression) this.rit;

return  lft_exp.checkSuitOk(row) && rit_exp.checkSuitOk(row);

}

}

5.4. AExpression

package com.attilax.linq;

import java.util.Map;

public class AExpression {

public Object left;

public Object rit;

public boolean checkSuitOk(Map row) {

throw new RuntimeException("no imp in base aexp class");

}

}

6. 参考

Atitit.linq api 兼容性草案 v2.docx

23种设计模式(14):解释器模式 - 卡奴达摩的专栏 - 博客频道 - CSDN.NET.htm

解释器模式 详解 - 疯狂程序员 - 博客频道 - CSDN.NET.htm

Atitit.linq java的原理与实现 解释器模式的更多相关文章

  1. Java设计模式(17)解释器模式(Interpreter模式)

    Interpreter定义:定义语言的文法,并且建立一个解释器来解释该语言中的句子. Interpreter似乎使用面不是很广,它描述了一个语言解释器是如何构成的,在实际应用中,我们可能很少去构造一个 ...

  2. Java描述设计模式(14):解释器模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.解释器模式 1.基础概念 解释器模式是对象的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端 ...

  3. Java设计模式(22)命令模式(Command模式)

    Command模式是最让我疑惑的一个模式,我在阅读了很多代码后,才感觉隐约掌握其大概原理,我认为理解设计模式最主要是掌握起原理构造,这样才对自己实际编程有指导作用.Command模式实际上不是个很具体 ...

  4. Java设计模式(4)原型模式(Prototype模式)

    Prototype模式定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是: ...

  5. Java设计模式(1)工厂模式(Factory模式)

    工厂模式定义:提供创建对象的接口. 为何使用工厂模式 工厂模式是我们最常用的模式了,著名的Jive论坛,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见. 为什么工厂模式是如此常用?因 ...

  6. Java设计模式(21)访问模式(Visitor者模式)

    Visitor定义:作用于某个对象群中各个对象的操作.它可以使你在不改变这些对象本身的情况下,定义作用于这些对象的新操作. 在Java中,Visitor模式实际上是分离了collection结构中的元 ...

  7. Java设计模式(19)状态模式(State模式)

    State的定义:不同的状态,不同的行为:或者说,每个状态有着相应的行为. 何时使用状态模式 State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If else ...

  8. Java设计模式(18)策略模式(Strategy模式)

    Strategy是属于设计模式中 对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类. Stratrgy应用比较广泛,比如,公司经营业务变化图,可能有两种实现方式,一个是线条曲线, ...

  9. Java设计模式(16)中介模式(Mediator模式)

    Mediator定义:用一个中介对象来封装一系列关于对象交互行为. 为何使用Mediator模式/中介模式 各个对象之间的交互操作非常多,每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉 ...

随机推荐

  1. Linux命令之vim(二)

    这一章主要介绍vim编辑器的内部使用方法和注意事项 vim编辑器有四种工作模式:正常模式.插入模式.命令模式.可视模式.简单的判断方法就是看底部,什么都没有就是正常模式,光标在编辑器最底下时则是命令模 ...

  2. RabbitMQ (七) 订阅者模式之主题模式 ( topic )

    主题模式和路由模式很像 路由模式是精确匹配 主题模式是模糊匹配 依然先通过管理后台添加一个交换机. 生产者 public class Producer { private const string E ...

  3. 【基数排序】Divide by Zero 2017 and Codeforces Round #399 (Div. 1 + Div. 2, combined) C. Jon Snow and his Favourite Number

    发现值域很小,而且怎么异或都不会超过1023……然后可以使用类似基数排序的思想,每次扫一遍就行了. 复杂度O(k*1024). #include<cstdio> #include<c ...

  4. 【kruscal】【最小生成树】【搜索】bzoj1016 [JSOI2008]最小生成树计数

    不用Matrix-tree定理什么的,一边kruscal一边 对权值相同的边 暴搜即可.将所有方案乘起来. #include<cstdio> #include<algorithm&g ...

  5. 【后缀数组】【二分答案】poj3261

    注意:对整型数组求sa时,s[n]请置成-1. 请离散化. 可重叠的 k 次最长重复子串(pku3261)给定一个字符串,求至少出现 k 次的最长重复子串,这 k 个子串可以重叠.算法分析:先二分答案 ...

  6. [CF607D]Power Tree

    题目大意: 一棵树初始只有一个编号为$1$的权值为$w_1$的根.$q(q\le2\times10^5)$次操作,每次可以给出$v,w(w<10^9)$,新建一个结点作为$v$的子结点,权值为$ ...

  7. codevs与noi做题改错本目录

    从2016.2.13开始: 1.  排序超时的问题---------目录:-测试习题 2.  超高精度乘法超时问题-----------目录:高精度计算 算法:快速傅里叶算法. 压位算法 3. 高精度 ...

  8. Jquery中的ajax应用(第九章PPT)

    <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1&q ...

  9. 理解面向对象编程---C#控制台实现52张扑克牌的分法

    52张牌随机分给4个玩家,要求每个玩家的牌用一个一维数组表示. 我们采用模拟大法.初始化一副扑克牌,洗牌,发牌. using System; using System.Collections.Gene ...

  10. CASJAVA一些理解

    如果不用锁机制如何实现共享数据访问.(不要用锁,不要 用sychronized  块或者方法,也不要直接使用 jdk  提供的线程安全的数据结构,需要自己实现一个类来保证多个线程同时读写这个类中的共享 ...