以下翻译脑袋的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设计模式的更多相关文章

  1. Visitor设计模式

    我猜想许多人都知道访问者设计模式,这种模式在“四人帮”的那本可复用面向对象软件基础的书被描述过.这个模式自身其实一点也不复杂(和以往的其他设计模式一样).  如上图所示: 我知道这个模式很久了,但是我 ...

  2. TypeScript实现设计模式——生成器模式

    生成器模式是一种在TypeScript/JavaScript中非常常见的创建型设计模式,它使你能够分步骤创建复杂对象.当你需要创建一个可能有许多配置选项的对象时, 该模式会特别有用. 问题 假设我们需 ...

  3. visitor设计模式记录

    数据类型通过枚举来区分是一种简单实用的做法. 缺点是使用的时候需要通过if .switch 去判断什么类型执行什么分支操作,说是缺点其实也要看具体场景.不过如果if代码多会导致代码很长是肯定的. 复杂 ...

  4. 浅谈设计模式-visitor访问者模式

    先看一个和visitor无关的案例.假设你现在有一个书架,这个书架有两种操作,1添加书籍2阅读每一本书籍的简介. //书架public class Bookcase { List<Book> ...

  5. Java设计模式学习资源汇总

    本文记录了Java设计模式学习书籍.教程资源.此分享会持续更新: 1. 设计模式书籍 在豆瓣上搜索了一把,发现设计模式贯穿了人类生活的方方面面.还是回到Java与程序设计来吧. 打算先归类,再浏览,从 ...

  6. java设计模式---访问者模式

      Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自 己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广 泛,遵循一定的编程模式,才能使自 ...

  7. AOP 的利器:ASM 3.0 介绍

    引言 什么是 ASM ? ASM 是一个 Java 字节码操控框架.它能被用来动态生成类或者增强既有类的功能.ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态 ...

  8. 【java】字节码操作技术

    asm.javassist.cglib. 1.asm 比较底层,使用的visitor设计模式. 官网:https://asm.ow2.io/ 2.javassist 官网:http://www.jav ...

  9. Java ASM 技术简介

    什么是ASM ASM 是一个 Java 字节码操控框架.它能被用来动态生成类或者增强既有类的功能.ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为. ...

随机推荐

  1. Spark Streaming no receivers彻底思考

    数据接入Spark Streaming的二种方式:Receiver和no receivers方式 建议企业级采用no receivers方式开发Spark Streaming应用程序,好处: 1.更优 ...

  2. mavn项目(springMVC) 引入静态资源(js、css)等

    在web.xml中配置 <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern ...

  3. 自开发实现Quartz Web管理

    网上能找到的QuartzWeb管理的资料都是使用的一个国外人写的Quartz WebApp的东东.功能也非常全面. 可是作为自己的应用其有用不了那么多功能,一般我们仅仅要能够定义一个job,指定一个C ...

  4. ftp上传下载至网站

    完整的命令行模式解析! 1. 首先open 域名(Ip)形式即可 实例: open 60.205.45.115 2.后面输入用户名(主机名): bxw2713600302 3.输入密码:密码默认显示不 ...

  5. 02-spring学习-配置bean

    在spring的IOC容器中配置Bean 一,在xml中通过bean节点来配置bean: class:bean的类名,通过反射的方式在IOC容器中创建Bean,所以要求bean中必须有无参的构造器 i ...

  6. SugarCRM如何检查控制器权限?

    SugarController定义了一个实例变量$hasAccess,布尔值,默认为true.该实例变量指示使用者是否有执行摸个action的权限: class SugarController{ /* ...

  7. Python 爬虫之 BeautifulSoup

    简介 Beautiful Soup提供一些简单的.python式的函数用来处理导航.搜索.修改分析树等功能.它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出 ...

  8. bootstrap 警告

    本章将讲解警告(Alerts)以及Bootstrap所提供的用于警告的class.警告(Alerts)向用户提供了一种定义消息样式的方式.它们为典型的用户操作提供了上下文信息反馈. 您可以为警告框添加 ...

  9. RJ45接口定义

    RJ45接口定义 常见的RJ45接口有两类:用于以太网网卡.路由器以太网接口等的DTE类型,还有用于交换机等的DCE类型. DTE我们可以称做“数据终端设备”,DCE我们可以称做“数据通信设备”.从某 ...

  10. Navicat for MySQL再谈之无奈之下还是去安装Navicat Premium

    不多说,直接上干货! 首先,Navicat for MySQL没有查看数据库属性. 其次,没有这个功能多和强大,在走过一段弯路之后,果断放弃Navicat for MySQL,而使用Navicat P ...