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) 解耦 : ...
随机推荐
- iOS 设计模式之工厂模式
iOS 设计模式之工厂模式 分类: 设计模式2014-02-10 18:05 11020人阅读 评论(2) 收藏 举报 ios设计模式 工厂模式我的理解是:他就是为了创建对象的 创建对象的时候,我们一 ...
- STM32下载显示target dll has been cancelled
使用MDK 4.74向STM32下载时出现各种错误,而且时隐时现, Internal command error.Error:Flash download failed. Target DLL has ...
- 获取本机IP非127.0.0.1
protected function GetiP() { $preg="/\A((([0-9]?[0-9])|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5] ...
- 【LeetCode】172. Factorial Trailing Zeroes
Factorial Trailing Zeroes Given an integer n, return the number of trailing zeroes in n!. Note: Your ...
- 在 Linux 的 KVM虚拟机 上安装 Mac OS 系统的研究总结
在 Linux 的 KVM虚拟机 上安装 Mac OS 系统的研究总结 一.资料来源: 网上一共找到两个方法,一个是视频上的教程,一个是网页资料. 二.视频资料方法内容:1.install qe ...
- HDU 4986
http://acm.hdu.edu.cn/showproblem.php?pid=4986 题意:n个钥匙放在n个箱子里,每个钥匙和箱子一一对应,求打开所有箱子的期望 题解: 题意: 求随机排列的期 ...
- 换个心境搞IT,在IT职场如何打拼?
刚进入IT这行时,我也是从程序员做起.尤其是前两三个月里,那种感觉就像时时刻刻处于备战状态一样.我是一个在对自己的要求方面有洁癖的人,在没有任何经验的状态下,只有坚持苦干,把下发的每件编程任务做好,才 ...
- MINIX3 进程调度分析
MINIX3 进程调度分析 5.1MINIX3 进程调度概要 MINIX3 的进程调度还是非常简单的,调度算法是非常短小的,其目的就是体现 了一个简单和高效的设计原则,当然简单和高效其实很难并存, ...
- buildroot ntp 网络时钟同步
/********************************************************************** * buildroot ntp 网络时钟同步 * 说明: ...
- LeetCode Combination Sum III (DFS)
题意: 在1-9这9个数字中选择k个出来,若他们的和为n,则加入答案序列,注意升序. 思路: 用DFS的方式,每次决定一个数字,共决策k次.假设上个决策是第i位为5,那么i+1位的范围就是6-9. c ...