TypeScript Visitor设计模式
以下翻译脑袋的VBF项目,试试看TypeScript能否重写。 class RegExpr {
Accept<T>(convert: Converter<T>) {
}
} class SymbolExpr extends RegExpr {
Symbol: string
constructor(symbol: string) {
this.Symbol = symbol;
super();
}
Accept<T>(convert: Converter<T>) {
return convert.AcceptSymbolExpr(this);
}
}
class KleeneStarExpr extends RegExpr {
InnerExpression: RegExpr
Accept<T>(convert: Converter<T>) {
return convert.AcceptKleeneStarExpr(this);
}
}
class AlternationExpr extends RegExpr {
Expr1: RegExpr
Expr2: RegExpr
Accept<T>(convert: Converter<T>) {
return convert.AcceptAlternationExpr(this);
}
}
class ConcatenationExpr extends RegExpr {
Left: RegExpr
Right: RegExpr
Accept<T>(convert: Converter<T>) {
return convert.AcceptConcatenationExpr(this);
}
}
class EmptyExpr extends RegExpr {
Accept<T>(convert: Converter<T>) {
return convert.AcceptEmpty(this);
}
} interface Converter<T> {
AcceptEmpty(expr: RegExpr): T;
AcceptSymbolExpr(expr: SymbolExpr): T;
AcceptKleeneStarExpr(expr: KleeneStarExpr): T;
AcceptAlternationExpr(expr: AlternationExpr): T;
AcceptConcatenationExpr(expr: ConcatenationExpr): T;
}
class RegularExprPrettyPrint implements Converter<String> { AcceptEmpty(expr: EmptyExpr) {
return "ε";
}
AcceptSymbolExpr(expr: SymbolExpr) {
return expr.Symbol;
}
AcceptKleeneStarExpr(expr: KleeneStarExpr) {
return "(" + expr.InnerExpression.Accept(this) + ")*";
}
AcceptAlternationExpr(expr: AlternationExpr) {
return "(" + expr.Expr1.Accept(this) + "|" + expr.Expr2.Accept(this) + ")";
}
AcceptConcatenationExpr(expr: ConcatenationExpr) {
return "(" + expr.Left.Accept(this) + expr.Right.Accept(this) + ")";
}
} window.onload = () => {
var s = new SymbolExpr("A");
var kstart = new KleeneStarExpr();
kstart.InnerExpression = s;
var formatter = new RegularExprPrettyPrint();
var str = kstart.Accept(formatter)
alert(str);
};
TypeScript Visitor设计模式的更多相关文章
- Visitor设计模式
我猜想许多人都知道访问者设计模式,这种模式在“四人帮”的那本可复用面向对象软件基础的书被描述过.这个模式自身其实一点也不复杂(和以往的其他设计模式一样). 如上图所示: 我知道这个模式很久了,但是我 ...
- TypeScript实现设计模式——生成器模式
生成器模式是一种在TypeScript/JavaScript中非常常见的创建型设计模式,它使你能够分步骤创建复杂对象.当你需要创建一个可能有许多配置选项的对象时, 该模式会特别有用. 问题 假设我们需 ...
- visitor设计模式记录
数据类型通过枚举来区分是一种简单实用的做法. 缺点是使用的时候需要通过if .switch 去判断什么类型执行什么分支操作,说是缺点其实也要看具体场景.不过如果if代码多会导致代码很长是肯定的. 复杂 ...
- 浅谈设计模式-visitor访问者模式
先看一个和visitor无关的案例.假设你现在有一个书架,这个书架有两种操作,1添加书籍2阅读每一本书籍的简介. //书架public class Bookcase { List<Book> ...
- Java设计模式学习资源汇总
本文记录了Java设计模式学习书籍.教程资源.此分享会持续更新: 1. 设计模式书籍 在豆瓣上搜索了一把,发现设计模式贯穿了人类生活的方方面面.还是回到Java与程序设计来吧. 打算先归类,再浏览,从 ...
- java设计模式---访问者模式
Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自 己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广 泛,遵循一定的编程模式,才能使自 ...
- AOP 的利器:ASM 3.0 介绍
引言 什么是 ASM ? ASM 是一个 Java 字节码操控框架.它能被用来动态生成类或者增强既有类的功能.ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态 ...
- 【java】字节码操作技术
asm.javassist.cglib. 1.asm 比较底层,使用的visitor设计模式. 官网:https://asm.ow2.io/ 2.javassist 官网:http://www.jav ...
- Java ASM 技术简介
什么是ASM ASM 是一个 Java 字节码操控框架.它能被用来动态生成类或者增强既有类的功能.ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为. ...
随机推荐
- sqlite 二进制字段 (zz)
有时我们用数据库存储文件,需要用到二进制字段,下面列常用方法. 1.写二进制数据 sqlite3 * db; int result; char **errmsg =NULL; result = sql ...
- 《大规模web服务开发技术》笔记
前段时间趁空把<大规模web服务开发技术>这本书看完了,今天用一下午时间重新翻了一遍,把其中的要点记了下来,权当复习和备忘.由于自己对数据压缩.全文检索等还算比较熟,所以笔记内容主要涉及前 ...
- RocketMQ通信协议
我们先从client端看一个消息是如何发送到服务端,服务端又是如何解析消息的. client端: 构造请求体: 构造请求体: 发送消息体: 下面看服务端: rocketmq的协议服务端解析救灾这里了R ...
- Git库搭建好之后,当要提交一个新的文件,需要做的是3个步骤
Git库搭建好之后,当要提交一个新的文件,需要做的是3个步骤 1.git add new.txt 2.git commit -m "add a new file" 3.git pu ...
- selenium-Getting Started
1.1. Simple Usage If you have installed Selenium Python bindings, you can start using it from Python ...
- CentOS安装rz\sz命令
执行以下命令进行安装: yum install lrzsz 安装完成后即可操作rz和sz命令. rz:本地文件上传. sz:Linux系统文件下载到本地.
- FastDFS这种架构,如何配置?
FastDFS这种架构,如何配置?才能让欧洲用户可以就近下载Storage Server1的文件,而不是到中国的Storage Server 2下载?
- openssl C语言编码实现rsa加密
非原创, 引用自: 1 CC=gcc CPPFLAGS= -I /home/yyx//openssl-1.0.1t/include/ CFLAGS=-Wall -g LIBPATH = -L /usr ...
- 以登录实例简单介绍Servlet使用
1.简单介绍 Java Servlet 是执行在 Web server或应用server上的程序,使用 Servlet.您能够收集来自网页表单的用户输入.呈现来自数据库或者其它源的记录.还能够动态创建 ...
- nginx-1.2.7+tcp_proxy_module负载均衡配置
对于安装方面不清楚的,可移步 nginx + tcp_proxy_module的安装 参考nginx_tcp_proxy_module的readme文件,对每个定义项都做了详细的描述,tcp{...} ...