dsl java 语言_DSL实现要点(3)--利用脚本语言实现DSL
由于脚本语言通常提供了更为简洁的语法及Java所不具有的一些新的语言特性(如:闭包,元编程等),所以在一些情况下可以创造出比Java程序更具有可读性的代码。另外,众多基于JVM的脚本语言也为与Java程序整合带来了便利。
Client: 语义模型实例的调用者
SemanticConcept: 语义模型定义,可以通过脚本语言或Java实现
ModelBuilder: 语义模型实例创建者,使用语义模型定义创建特定语义模型实例
相关基本概念可以参考:
以下还是以自动门状态机来作为实例:
语义概念定义:
Process.java
packageorg.ccsoft.statemachine;
importjava.util.List;
publicclassProcess {
privateStringname;
privateListstates;
publicString getName() {
returnname;
}
publicvoidsetName(String name) {
this.name= name;
}
publicList getStates() {
returnstates;
}
publicvoidsetStates(List states) {
this.states= states;
}
privateState getStateByName(String name){
for(State state:states){
if(state.getName().equals(name)){
returnstate;
}
}
returnnull;
}
publicState transit(String curState,String event){
for(State state:states){
if(state.getName().equals(curState)){
String nextS=state.getTransitions().get(event);
returngetStateByName(nextS);
}
}
returnnull;
}
}
State.java
packageorg.ccsoft.statemachine;
importjava.util.Map;
publicclassState {
privateStringname;
/**Map**/
privateMaptransitions;
publicString getName() {
returnname;
}
publicvoidsetName(String name) {
this.name= name;
}
publicMap getTransitions() {
returntransitions;
}
publicvoidsetTransitions(Map transitions) {
this.transitions= transitions;
}
@Override
publicbooleanequals(Object obj) {
if(objinstanceofState){
State other=(State)obj;
if(other.getName().equals(this.name)){
returntrue;
}
}
returnfalse;
}
@Override
publicinthashCode() {
//TODOAuto-generated method stub
returnname.hashCode();
}
@Override
publicString toString() {
//TODOAuto-generated method stub
returnname;
}
}
语义模型实例创建者
IStateMachineBuilder.java
packageorg.ccsoft.statemachine;
publicinterfaceIStateMachineBuilder {
publicProcess build(String processName);
}
packageorg.ccsoft.statemachine
publicclassStateMachineBuilderimplementsIStateMachineBuilder{
publicProcess build(String processName){
switch(processName){
case"service":
Process process =
newProcess(
states:[
newState(
name:"open",
transitions:
[
"timeOut":"close",
"peopleClose":"close"
]
),
newState(
name:"close",
transitions:
[
"peopleOpen":"close"
]
)
]
);
returnprocess;
default:
returnnull;
}
}
}
作者采用的是Groovy,可见语言特性(集合及对象创建)有效提高了代码的可读性。
连接脚本语言与Java
作者采用Spring来实现Java及脚本语言的连接,你可以采用其他方式(如:JDK6的Script Engine)。
Spring配置文件(stateMachine.xml)
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:lang="http://www.springframework.org/schema/lang"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd">
Java调用程序
packageorg.ccsoft.statemachine;
importorg.springframework.context.ApplicationContext;
importorg.springframework.context.support.ClassPathXmlApplicationContext;
publicclassMain {
/**
*@paramargs
*/
publicstaticvoidmain(String[] args) {
ApplicationContext ctx =newClassPathXmlApplicationContext("stateMachine.xml");
IStateMachineBuilder builder=(IStateMachineBuilder) ctx.getBean("stateMachineBuilder");
Process process=builder.build("service");
State nextState = process.transit("open","timeOut");
System.out.println(nextState);
}
}
由于脚本语言是解释执行的,所以可以用作配置文件一样,在部署后进行修改。同时脚本语言本身所具有的强大语法可以使其很容易地完成普通配置很难完成的功能。所以在很多时候我们都应该考虑使用脚本语言来进行配置。
posted on 2010-04-06 18:21 超越巅峰 阅读(3416) 评论(0) 编辑 收藏 所属分类: DSL
dsl java 语言_DSL实现要点(3)--利用脚本语言实现DSL相关推荐
- c语言编程能控制热风炉,利用C语言设计热风炉悬链线拱顶研究.pdf
j|il ll_ ll梅 诋 融 技 j 萎 |.每薯tj n叠宣鞲s瓿 利用C语言设计热风炉悬链线拱顶 鄢 明 吴建霖 冯 飞 (柳钢设计院) 摘 要 :介绍 了利用 C语言求解两段 圆弧拟合悬链线 ...
- Java前端学习(一)JavaScript脚本语言基础
JavaScript脚本语言基础 前言 一.JavaScript简介 1.应用 2.特点 3.示例 4.补充 二.语法基础 1.数据类型 2.表达式和运算符 3.流程控制语句 4.函数 三.对话框 1 ...
- java脚本语言是什么_什么是脚本语言
在维基百科上的通俗解释是,一般使用文本保存,不需要'编译'的语言的,直接由解释器的语言.脚本语言 也就是说脚本语言其实是为了方便的使用,运行简单的一门语言.就像js一样,在去掉BOM,DOM,还有No ...
- SHELL/SSH基础知识(入门篇)-包含 shell 脚本语言的基本用法、 shell 脚本语言的基本用法、流程控制、函数 function、其它脚本相关工具、数组 array(欢迎留言交流)
目录 1 shell 脚本语言的基本用法 1.1 shell 脚本注释规范 1.1.1 shell 脚本注释规范 1.1.2 执行(5种) 1.1.3 在远程主机运行本地脚本 1.1.4 检查shel ...
- linux脚本语言求累加和,Linux Shell脚本语言与数学表达式
当你理解了Shell脚本,每当需要时都能流畅编写时,那种感觉很爽的.本章中,我们将教你用脚本语言进行比较复杂的数学运算. 让我们从斐波那契数列开始吧. 斐波那契数列,又称黄金分割数列,指的是这样一个数 ...
- 在linux中写php语言吗,将PHP作为Shell脚本语言使用
我们都知道,PHP是一种非常好的动态网页开发语言(速度飞快,开发周期短--).但是只有很少数的人意识到PHP也可以很好的作为编写Shell脚本的语言,当PHP作为编写Shell脚本的语言时,他并没有P ...
- python脚本语言可以跨平台使用吗_CSCS脚本语言可以轻松进行跨平台开发
原标题:CSCS脚本语言可以轻松进行跨平台开发 CSCS(C#中的自定义脚本)是一种用C#实现的开源脚本语言.从语法上讲,它与JavaScript非常相似,当然与Python也有一些相似之处.其中一些 ...
- c语言魔方还原程序案例,利用C语言玩转魔方阵实例教程
魔方阵 魔方阵,古代又称"纵横图",是指组成元素为自然数1.2-n的平方的n×n的方阵,其中每个元素值都不相等,且每行.每列以及主.副对角线上各n个元素之和都相等. 如3×3的魔方 ...
- c语言读h5文件,我利用C语言实现SHA-256算法,需要从一个txt文件中读出数据并把...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 并把得到的密文写入另一个txt文件张该怎么改代码啊? #include #include extern char* StrSHA256(const cha ...
最新文章
- webView加载不出网页的一种可能情况
- 线性回归之模型的保存和加载
- window.location操作url对象
- 机器人学习--Mobile robotics 国外大牛及实验室
- Pandas多层级索引的数据分析案例,超干货的!
- HDU 5691 Sitting in Line 状压dp
- leetcode226. 翻转二叉树(dfs)
- C语言 socket 编程学习
- uc浏器保存html,UC浏览器不能保存历史记录
- Spinner与适配器模式总结
- python学习(1)启程
- 工程师如何优雅的拒绝不合理需求
- pta c语言编程答案,PTA 程序设计 单选题-期末复习
- 0x80070079信号灯超时_windows server 2012 连接共享报0x80070079 信号灯超时时间已到
- msdtc.exe dll劫持
- firebug尺寸标尺消失不显示问题
- 机械动力学瑞利法matlab程序,机器人学回炉重造(4):动力学仿真(附牛顿-欧拉递归逆动力学算法matlab代码)...
- java word设置纸张a3,Word中进行设置A3文档纸张大小的操作技巧
- 物联网体系的系统构架和用途
- 关于 IR 在程序分析和优化中应用的一些思考
热门文章
- redistemplate动态切换数据库(亲测可用)
- java 内部匿名类_java匿名类和匿名内部类详解
- SAP MM 作为采购附加费的运费为啥没能在收货的时候计入物料成本?
- Java 等比例缩放图片
- 华为EMUI10 多端开发部署统一开发工具
- iPhone 8首遭破解,银行卡密码泄露,这场燃爆的黑客大会还有什么
- 铁道警察学院 计算机,铁警emoji,看看你的校园生活
- JAVA中方法的调用(详细整理)
- 荣耀什么手机能用鸿蒙,惊喜!荣耀手机也能升鸿蒙:这 5 款机型用户有福了
- java计算机毕业设计校园便利店信息系统开发源代码+数据库+系统+lw文档