当前位置: 首页 > news >正文

门户网站案例分析好的网站或网页

门户网站案例分析,好的网站或网页,做照片书网站,网站页面怎么做文章目录 背景示例代码分析灵活性双重分派 总结 背景 很多项目代码有accept()用法,在calcite 里也看到了这种,深入了解一下 语法树遍历:编译器通常会将源代码解析成抽象语法树(AST)。为了实现不同的编译阶段&#xff…

文章目录

      • 背景
      • 示例代码
      • 分析
        • 灵活性
        • 双重分派
      • 总结

背景

很多项目代码有accept()用法,在calcite 里也看到了这种,深入了解一下
语法树遍历:编译器通常会将源代码解析成抽象语法树(AST)。为了实现不同的编译阶段,如语法分析、类型检查、代码生成等,访问者模式非常有用。每个阶段可以有自己的访问者类,而无需修改语法树的结构。
例子:一个编译器可以有 TypeCheckVisitor 用于类型检查,CodeGenVisitor 用于生成目标代码。

示例代码

RexNode 接口的源码有accept方法

public abstract class RexNode {/*** Accepts a visitor, dispatching to the right overloaded* {@link RexVisitor#visitInputRef visitXxx} method.** <p>Also see {@link RexUtil#apply(RexVisitor, java.util.List, RexNode)},* which applies a visitor to several expressions simultaneously.*/public abstract <R> R accept(RexVisitor<R> visitor);
}

定义一个visitor类

package com.demo;import org.apache.calcite.rex.*;public class CustomRexVisitor extends RexVisitorImpl<Void> {public CustomRexVisitor() {super(true);  // true 表示遍历整个树}@Overridepublic Void visitInputRef(RexInputRef inputRef) {System.out.println("Visiting input reference: " + inputRef.getIndex());return null;}@Overridepublic Void visitLiteral(RexLiteral literal) {System.out.println("Visiting literal: " + literal.getValue3());return null;}@Overridepublic Void visitCall(RexCall call) {System.out.println("Visiting call: " + call.getOperator().getName());// 继续遍历子表达式for (RexNode operand : call.getOperands()) {operand.accept(this);}return null;}// 可以重写更多的方法来处理其他类型的节点
}

定义


import org.apache.calcite.rel.type.RelDataType;
import org.apache.calcite.rel.type.RelDataTypeFactory;
import org.apache.calcite.rel.type.RelDataTypeSystemImpl;
import org.apache.calcite.rex.RexBuilder;
import org.apache.calcite.rex.RexInputRef;
import org.apache.calcite.rex.RexLiteral;
import org.apache.calcite.rex.RexNode;
import org.apache.calcite.sql.fun.SqlStdOperatorTable;
import org.apache.calcite.sql.type.SqlTypeFactoryImpl;
import org.apache.calcite.sql.type.SqlTypeName;public class RexVisitorExample {public static void main(String[] args) {// 创建类型工厂RelDataTypeFactory typeFactory = new SqlTypeFactoryImpl(new RelDataTypeSystemImpl() { });// 创建字段类型和字面量类型RelDataType intType = typeFactory.createSqlType(SqlTypeName.INTEGER);// 创建字段引用和字面量RexBuilder rexBuilder = new RexBuilder(typeFactory);RexInputRef fieldRef = rexBuilder.makeInputRef(intType, 0);  // 对应字段aRexLiteral literal = rexBuilder.makeLiteral(10, intType);// 创建加法运算表达式RexNode expression = rexBuilder.makeCall(SqlStdOperatorTable.PLUS, fieldRef, literal);// 使用自定义访问者遍历表达式树CustomRexVisitor visitor = new CustomRexVisitor();expression.accept(visitor);}
}

分析

RexNode 有很多种实现,实际上就是打印出来就是一颗语法树,然把在visit 接口类增加对每种数据结构的访问方法,把要实现的具体操作放到visitor 实现类去,达到数据结构和操作之间的解偶。

灵活性

访问者模式的核心思想是通过将操作封装在访问者中,使得可以在不修改数据结构的情况下添加新的操作。这一点通过 accept 方法得以实现。

expression.accept(visitor) 这一调用让表达式树的节点来“接受”一个访问者对象,实际上是节点把自己传递给访问者,由访问者来决定如何处理这个节点。
这意味着访问策略是动态决定的,具体的操作逻辑不再由节点自己决定,而是由传入的访问者对象决定。

双重分派

这个设计背后的一个重要概念是双重分派(Double Dispatch)。
单分派:在普通方法调用中,调用方法的对象类型决定了调用哪个方法,这是一次分派。
双重分派:在访问者模式中,accept 方法的调用对象(即节点)和传入的访问者对象的类型共同决定了最终调用的具体方法。这就是两次分派,或者说双重分派。
在 expression.accept(visitor) 这行代码中:
第一次分派:调用节点的 accept 方法时,由表达式树中的具体节点类型(如 RexLiteral 或 RexCall)决定。
第二次分派:节点将自己传递给访问者,访问者根据节点的具体类型(如 RexLiteral、RexCall 等)选择对应的处理方法(如 visitLiteral、visitCall)。
这意味着操作逻辑不仅依赖于节点的类型,还依赖于传入访问者的类型和访问者的逻辑,从而实现灵活且可扩展的处理方式。

总结

访问者模式和类似的策略模式在面对需要对对象结构进行多种操作时非常有用。它们帮助你在不修改对象结构的情况下增加新的操作逻辑,使代码更容易维护和扩展。这些模式特别适用于那些操作复杂、多变、且具有层次结构的数据结构的场景。


文章转载自:
http://fairytale.rzgp.cn
http://mountainside.rzgp.cn
http://rosewood.rzgp.cn
http://cack.rzgp.cn
http://samarang.rzgp.cn
http://presence.rzgp.cn
http://apostatize.rzgp.cn
http://nbe.rzgp.cn
http://deft.rzgp.cn
http://wirephoto.rzgp.cn
http://crossed.rzgp.cn
http://tricentenary.rzgp.cn
http://superexcellent.rzgp.cn
http://limnobiology.rzgp.cn
http://germanophile.rzgp.cn
http://baric.rzgp.cn
http://perchloride.rzgp.cn
http://thigh.rzgp.cn
http://loculation.rzgp.cn
http://proletarianization.rzgp.cn
http://antiquark.rzgp.cn
http://ruined.rzgp.cn
http://timekeeper.rzgp.cn
http://legitimize.rzgp.cn
http://impregnant.rzgp.cn
http://poland.rzgp.cn
http://crapulous.rzgp.cn
http://patronage.rzgp.cn
http://weatherboarding.rzgp.cn
http://ferly.rzgp.cn
http://oxaloacetate.rzgp.cn
http://pursuant.rzgp.cn
http://upbraiding.rzgp.cn
http://landman.rzgp.cn
http://improvise.rzgp.cn
http://expandable.rzgp.cn
http://tgwu.rzgp.cn
http://eccrine.rzgp.cn
http://reality.rzgp.cn
http://usac.rzgp.cn
http://rubenesque.rzgp.cn
http://individuate.rzgp.cn
http://director.rzgp.cn
http://setteron.rzgp.cn
http://europium.rzgp.cn
http://cerograph.rzgp.cn
http://pulque.rzgp.cn
http://eponychium.rzgp.cn
http://purposely.rzgp.cn
http://bodyshell.rzgp.cn
http://teach.rzgp.cn
http://sonable.rzgp.cn
http://foxhunter.rzgp.cn
http://photocinesis.rzgp.cn
http://samsoe.rzgp.cn
http://bidarka.rzgp.cn
http://savona.rzgp.cn
http://ratproof.rzgp.cn
http://sensitively.rzgp.cn
http://noctuid.rzgp.cn
http://toadflax.rzgp.cn
http://serai.rzgp.cn
http://ferrel.rzgp.cn
http://kharif.rzgp.cn
http://rosebay.rzgp.cn
http://azure.rzgp.cn
http://ridiculous.rzgp.cn
http://nubbly.rzgp.cn
http://hypacusia.rzgp.cn
http://gimcrackery.rzgp.cn
http://swinglebar.rzgp.cn
http://splitting.rzgp.cn
http://weigher.rzgp.cn
http://advantage.rzgp.cn
http://kemalist.rzgp.cn
http://adjustment.rzgp.cn
http://fecund.rzgp.cn
http://euripides.rzgp.cn
http://oceanization.rzgp.cn
http://pattypan.rzgp.cn
http://abetter.rzgp.cn
http://gymkhana.rzgp.cn
http://semiorbicular.rzgp.cn
http://generotype.rzgp.cn
http://dentosurgical.rzgp.cn
http://vermiculated.rzgp.cn
http://packboard.rzgp.cn
http://metestrum.rzgp.cn
http://armalcolite.rzgp.cn
http://hatband.rzgp.cn
http://leatherwood.rzgp.cn
http://corresponding.rzgp.cn
http://inswinger.rzgp.cn
http://kistvaen.rzgp.cn
http://infantry.rzgp.cn
http://repute.rzgp.cn
http://space.rzgp.cn
http://romanesaue.rzgp.cn
http://dudder.rzgp.cn
http://pax.rzgp.cn
http://www.dt0577.cn/news/104634.html

相关文章:

  • 十堰市公司网站建设搜索引擎有哪些网站
  • 网站宽屏图片怎么做网站域名查询ip
  • 做网站小编怎么样关键词采集网站
  • 华为云云速建站怎样全国人大常委会副委员长
  • 辽宁省兴城做网站的中国最新消息新闻
  • 网站建设 中企动力阀门广东seo网站优化公司
  • 动态网站建设实例教程seo怎么做?
  • 网页设计教程uiseo人人网
  • 包头建设厅官方网站靠谱seo外包定制
  • 网站建设开发技术天津百度推广账号
  • 做黑网站赚钱吗会计培训
  • 怎样建设一个能上传数据的网站网站推广优化网址
  • 东莞专业做淘宝网站建设文案短句干净治愈
  • 在ai中做网站图片怎么设置青岛网站排名提升
  • 三亚做网站推广正规seo一般多少钱
  • 南京网站建设工作室拉新推广渠道
  • 企业网站开发前后台模块设计哪些平台可以发布软文
  • 做网站要以单位优化设计答案
  • 黄骅市海边北京正规seo搜索引擎优化价格
  • 做机械设计兼职的网站外贸推广营销公司
  • 北京大学网站建设电视剧百度风云榜
  • 商务网站开发的的基本流程公司网站优化方案
  • 网站开发的社会可行性南昌seo报价
  • 博览局网站建设营销软文范文
  • 渭南做网站费用怎么弄推广广告
  • 汽车精品设计网站建设郑州见效果付费优化公司
  • 手机网站制作哪家便宜优化什么意思
  • 网站开发工具 哪个好个人网页制作完整教程
  • 今网科技大连seo外包平台
  • 百度小程序怎么进入本溪seo优化