介绍
利用JAVA面向对象思想快速开发脚本计算器
准备工作
教程基于 IDEA2020.3.2 JDK1.8 开发
- 需求分析 :
我们利用JS脚本来完成简易计算器,那么需要一个js文件以及相关项目demo,需要有 加减乘除 四个功能。
既然我们明白了功能需求,那我们就开始动手把!
- 类的定义:
创建一个数字信息 (NumberData) 类用来储存数据项 和 数字计算接口(NumberCalculation) 以及相关实现类(NumberAdapter)
代码如下
- NumberData(数字数据类)
package cn.marinda.data;
public class NumberData
{
private int num1;
private int num2;
public NumberData(int num1 ,int num2)
{
this.num1 = num1;
this.num2 = num2;
}
public int getNum1() {
return num1;
}
public void setNum1(int num1) {
this.num1 = num1;
}
public int getNum2() {
return num2;
}
public void setNum2(int num2) {
this.num2 = num2;
}
}
- NumberAdapter(实现类)
package cn.marinda.handle;
import cn.marinda.data.NumbersCalculation;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import java.io.FileReader;
public class NumberAdapter implements NumbersCalculation {
public static NumberAdapter adapter = new NumberAdapter();
private NumberAdapter()
{
}
/**
* 计算返回整数结果
*
* @param num1 数字一
* @param num2 数字二
* @param mode 方式
* @return
*/
@Override
public int getIntResult(int num1, int num2, String mode) {
String thisMode = isMode(mode);
int result = jsInvoke(num1, num2, mode);
return result;
}
/**
* 计算返回小数结果
*
* @param num1 数字一
* @param num2 数字二
* @param mode 方式
* @return
*/
@Override
public int getDoubleResult(int num1, int num2, String mode) {
return 0;
}
/** 验证类型
*
* @param mode 类型
* @return 计算类型
* 返回类型
*/
private String isMode(String mode)
{
switch (mode)
{
case "+":
return "+";
case "_":
return "_";
case "*":
return "*";
case "/":
return "/";
}
return null;
}
/** 通过JS脚本来快速计算结果
* 计算器
* @param num1 数字1
* @param num2 数字2
* @param mode 类型
* @return 计算结果
* use JavaScrip
*/
public int jsInvoke(int num1,int num2,String mode)
{
ScriptEngineManager mannager = new ScriptEngineManager();
ScriptEngine engine = mannager.getEngineByName("javascript");
String jsFiles = "src/invoke.js";
double results = 0.0;
try {
FileReader reader = new FileReader(jsFiles);
engine.eval(reader);
if(engine instanceof Invocable){
Invocable invokes = (Invocable) engine;
results = (double)invokes.invokeFunction("invoke",num1,num2,mode);
}else{
reader.close();
}
}catch (Exception e){
e.printStackTrace();
}
return (int)results;
}
}
- NumberCalculation(数字计算接口)
package cn.marinda.data;
public interface NumbersCalculation {
/** 计算返回整数结果
*
* @param num1 数字一
* @param num2 数字二
* @param mode 方式
* @return
*/
public int getIntResult(int num1,int num2,String mode);
/** 计算返回小数结果
*
* @param num1 数字一
* @param num2 数字二
* @param mode 方式
* @return
*/
public int getDoubleResult(int num1,int num2,String mode);
}
- index.js
function invoke(a, b,mode) {
var c = (a + mode + b);
var num1 = Number(c.substr(0,1));
var num2 = Number(c.substr(c.length-1));
var r = 0;
switch (mode) {
case "+":
r = (a + b);
break;
case "*":
r = (a * b);
break;
case "/":
r = (a / b);
break;
case "-":
r = (a - b);
break;
}
return r;
}
由于我们这里的 JavaScript 读出来的 mode 不能被直接进行运算,我们就通过JavaScript 的SubString方法来分贝取Number1 和 Number2 然后再通过switch来取mode进行计算
main方法
package cn.marinda;
import cn.marinda.data.NumberData;
import cn.marinda.handle.NumberAdapter;
import java.util.Scanner;
public class Application {
public static void main(String[] args) {
applications();
}
private static void applications() {
while (true) {
System.out.println("欢迎使用白云计算器");
System.out.println("请输入一个整数");
Scanner scanner = new Scanner(System.in);
int num1 = scanner.nextInt();
System.out.println("请输入再输入一个整数");
int num2 = scanner.nextInt();
System.out.println("请输入操作符");
String mode = scanner.next();
NumberData data = new NumberData(num1,num2);
System.out.println("计算结果是:" + NumberAdapter.adapter.getIntResult(data.getNum1(),data.getNum2(),mode));
System.out.println("要退出请按q键,按其他键继续!");
String str = scanner.next();
if(!str.equalsIgnoreCase("q")){
continue;
}else{
System.out.println("good bye!");
break;
}
}
}
}
功能效果
结束语
功能实现完毕
主要还是用到Java内置的ScriptEngineManager和 ScriptEngine 来与JavaScript搭桥牵线。
关于ScriptEngineManager 和ScriptEngineManager
- 可以看CSDN其他博主文章以及自行百度
- 初次发布对内容有疑问的欢迎评论指出