java 计算器基于工厂模式和功能单一模式
import java.util.Scanner;
public class CaculationTest {
public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
double a, b, result = 0;
String operator;
Operation operation = null;
System.out.println("************************");
System.out.println("* 学号:1308060310 *");
System.out.println("* 班级:网络131班 *");
System.out.println("* 姓名:王朝远 *");
System.out.println("************************");
TwoFromConsole twoFromConsole = new TwoFromConsole();
a = twoFromConsole.getFirstDoubleFromConsole(); // 获取第一个数
b = twoFromConsole.getTwoDoubleFromConsole(); // 获取第二个数
OperatorFromConsole operatorFromConsole = new OperatorFromConsole();
operator = operatorFromConsole.getOperator(); // 获取运算符号
do {
if (operator.equals("/") && b == 0) {
System.out.print("除法运算分母不能为0,请重新输入,");
b = twoFromConsole.getTwoDoubleFromConsole(); // 获取第二个数
continue;
}
break;
} while (true);
// 获取要运算的对象
operation = Factory.getInstance(operator);
result = operation.getResult(a, b);
// 判断用户是否继续对数运算,如果是继续对数运算,结果的输出方式就不一样,并且让用户选择是否再次计算
if (operator.equals("log")) {
System.out.println("log" + "(" + b + ")" + a + "=" + result);
} else {
System.out.println(a + operator + b + "=" + result);
}
}
}
class TwoFromConsole {
Scanner reader = new Scanner(System.in);
// 获取数字的方法的具体实现
public double getFirstDoubleFromConsole() {
double x = 0;
System.out.print("请输入第一个数字:");
do {
double temp = 0;
try {
temp = reader.nextDouble();
} catch (Exception e) {
System.out.print("请重新输入第一个数字:");
continue;
}
x = temp;
break;
} while (true);
return x;
}
public double getTwoDoubleFromConsole() {
double x = 0;
System.out.print("请输入第二个数字:");
do {
double temp = 0;
try {
temp = reader.nextDouble();
} catch (Exception e) {
System.out.print("请重新输入第二个数字:");
continue;
}
x = temp;
break;
} while (true);
return x;
}
}
/**
* 获取运算符类
*/
class OperatorFromConsole {
Scanner reader = new Scanner(System.in);
/**
* @return 合理的运算符
*/
public String getOperator() {
System.out.print("请输入运算符:");
String operator;
boolean b;
do {
operator = reader.nextLine();
b = !(operator.equals("+") || operator.equals("-") || operator.equals("*") || operator.equals("/")
|| operator.equals("log"));
if (b == true) {
System.out.print("请重新输入运算符:");
}
} while (b);
return operator;
}
}
/**
* 功能:各个运算的父接口,子类必须实现父接口里面的方法
*/
interface Operation {
double getResult(double x, double y);
}
/**
* 实现加法运算的类
*/
class Add implements Operation {
/**
* 重写接口里面的方法,并实现加法功能
*/
@Override
public double getResult(double x, double y) {
// TODO Auto-generated method stub
return x + y;
}
}
/**
* 实现减法运算的类
*/
class Sub implements Operation {
/**
* 重写接口里面的方法,并实现减法功能
*/
@Override
public double getResult(double x, double y) {
// TODO Auto-generated method stub
return x - y;
}
}
/**
* 实现乘法运算的类
*/
class Mul implements Operation {
/**
* 重写接口里面的方法,并实现乘法功能
*/
@Override
public double getResult(double x, double y) {
// TODO Auto-generated method stub
return x * y;
}
}
/**
* 实现除法运算的类
*/
class Div implements Operation {
/**
* 重写接口里面的方法,并实现除法功能
*/
@Override
public double getResult(double x, double y) {
// TODO Auto-generated method stub
return x / y;
}
}
/**
* 实现对数运算的类
*/
class Logarithm implements Operation {
/**
* 重写接口里面的方法,并实现对数运算功能
*/
@Override
public double getResult(double x, double y) {
// TODO Auto-generated method stub
return Math.log(x) / Math.log(y); // x表示对数,y表示底数
}
}
/**
* 生成用户所需要的对象工厂类
*/
class Factory {
/**
* @param operator
* 用户选择的运算
* @return 用户所需要的对象
*/
public static Operation getInstance(String operator) {
Operation operation = null;
switch (operator) {
case "+":
operation = new Add(); // 实例化加法对象
break;
case "-":
operation = new Sub(); // 实例化减法对象
break;
case "*":
operation = new Mul(); // 实例化乘法对象
break;
case "/":
operation = new Div(); // 实例化除法对象
break;
case "log":
operation = new Logarithm(); // 实例化对数运算对象
break;
}
return operation;
}
}
java 计算器基于工厂模式和功能单一模式的更多相关文章
- java之设计模式工厂三兄弟之抽象工厂模式
[学习难度:★★★★☆,使用频率:★★★★★] 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工 ...
- java之设计模式工厂三兄弟之简单工厂模式
[学习难度:★★☆☆☆,使用频率:★★★☆☆] 工厂模式是最常用的一类创建型设计模式,通常我们所说的工厂模式是指工厂方法模式,它也是使用频率最高的工厂模式.本章将要学习的简单工厂模式是工厂方法模式的& ...
- Java 设计模式之工厂模式(二)
原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...
- JAVA设计模式之工厂方法模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述工厂方法模式的: 工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymor ...
- java三种工厂模式
适用场合: 7.3 工厂模式的适用场合 创建新对象最简单的办法是使用new关键字和具体类.只有在某些场合下,创建和维护对象工厂所带来的额外复杂性才是物有所值.本节概括了这些场合. 7.3.1 动态实现 ...
- java 三种工厂模式
一.简单工厂模式 一个栗子: 我喜欢吃面条,抽象一个面条基类,(接口也可以),这是产品的抽象类. public abstract class INoodles { /** * 描述每种面条啥样的 */ ...
- java之设计模式工厂三兄弟之工厂方法模式
[学习难度:★★☆☆☆,使用频率:★★★★★] 简单工厂模式虽然简单,但存在一个很严重的问题.当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码 ...
- 女娲造人引发思考之Java设计模式:工厂模式
目录 工厂模式的几种形态 简单工厂模式 示例 结构 优缺点 女娲抟土造人 工厂方法模式 结构 女娲举绳造人 抽象工厂模式 结构 女娲造万物 工厂模式的几种形态 工厂模式专门负责将大量有共同接口的类实例 ...
- java设计模式,工厂,代理模式等
javaEE设计模式: 工厂模式:主要分为三种模式: 定义:在基类中定义创建对象的一个接口,让子类决定实例化哪个类.工厂方法让一个类的实例化延迟到子类中进行. 为什么要使用工厂模式: (1) 解耦 : ...
随机推荐
- jQuery 操作CSS
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- AlarmManager
转自:http://blog.csdn.net/wangxingwu_314/article/details/8060312 1.AlarmManager,顾名思义,就是“提醒”,是Android中常 ...
- 上位机控制led
使用库函数,调试的结果在标红程序上,int main(void){ u8 a; u8 t; u8 len; u16 ti ...
- 解决win7资源监视器不能开启
刚开始时是这样,点击开始监控,无效 需要开始服务即可解决
- php大力力 [033节] 随便看看:PHP程序员学习C++
php大力力 [033节] 随便看看:PHP程序员学习C++ 2014 兄弟连高洛峰 PHP教程14.1.7 在PHP脚本中操作MySQL数据库4 观看 - 56.com http://www.med ...
- 产生冠军 map 的 应用 .
开始 比赛 , 每一次的 比赛 都会有人失败 , 如果产生英雄的话 , 那就是产生 唯一一个 没有被打败的人 , 就是英雄, . #include<stdio.h> #includ ...
- 我与python3擦肩而过(二)—— csv文件头哪去啦?
在看Python Data Visualization Cookbook 这本书(基于python2),开始时读取csv文件头的时候出现问题.查了资料,又是python3的问题,从这个链接找到答案. ...
- c++回调函数 callback
C++中实现回调机制的几种方式 (1)Callback方式Callback的本质是设置一个函数指针进去,然后在需要需要触发某个事件时调用该方法, 比如Windows的窗口消息处理函数就是这种类型.比如 ...
- Windows 7下安装部署NodeJs
第一步 安装NodeJs http://nodejs.org/download/ 下载windows版本的msi文件,双击进行安装即可.安装完毕,默认安装路径为C:\Program Files\no ...
- Push推送原理
Push 的工作机制 APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,是苹果的服务器. 推送可以分为三个阶段. 第一阶段:.net应用程 ...