上午看来一篇大话设计模式的文章。颇有感触,借此机会。将自己的感悟。写录于此,以便日后翻阅!
项目目标:
使用面向对象的语言实现一个计算器功能。
思考:计算器的功能,1显示,2计算
所有本人将计算器拆分为两块去写,计算方面有+、-、*、/、......方便日后的扩展。所以本人决定抽取一个计算的基类,由于积累是抽象的所以把它的类型定为了抽象类。
由于本次项目只涉及到+、-、*、/所以目前的类情况,看下图。图片链接:http://on-img.com/chart_image/5b95d8c4e4b0fe81b62d916a.png。
好了接下来就是代码实现环节了:
Operating:抽象类
public abstract class Operating {
protected double numberA;
protected double numberB;
/**
* 获取计算结果,默认为0
* @return
*/
public double getResult() throws MyException {
return 0;
}
}
OperationAdd:加法类
public class OperationAdd extends Operating {
/**
* 重写计算结果获取,值为numberA+numberB
* @return
*/
@Override
public double getResult() {
return numberA+numberB;
}
}
OperationReduce:减法类
public class OperationReduce extends Operating {
/**
* 重写获取计算的值,值为numberA-numberB
* @return
*/
@Override
public double getResult() {
return numberA-numberB;
}
}
OperationMultiplication:乘法类
public class OperationMultiplication extends Operating {
/**
* 重写计算结果,值为numberA*numberB
* @return
*/
@Override
public double getResult() {
return numberA*numberB;
}
}
OperationDivistion:除发类
public class OperationDivision extends Operating {
/**
* 重写计算方法,值为numberA/numberB
* @return
*/
@Override
public double getResult() throws MyException {
if(numberA==0){
throw new MyException("除数不能为0");
}
return numberA/numberB;
}
}
MyException:自定义异常类
public class MyException extends RuntimeException {
private String message;
public MyException(String message){
super(message);
this.message = message;
}
@Override
public String getMessage() {
return message;
}
}
OperationFactory:计算工厂类
public class OperationFactory {
public static Operating createOperation(String operation){
switch (operation){
case "+": return new OperationAdd();
case "-": return new OperationReduce();
case "*": return new OperationMultiplication();
case "/": return new OperationDivision();
default: return null;
}
}
}
console:控制类
import com.sun.xml.internal.ws.commons.xmlutil.Converter;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Console {
/**
* 输入并显示,实现一个计算器控制台的效果
*/
public void inputAndShow(){
try {
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入数字A");
String strNumberA = buf.readLine();
System.out.println("请输入数字B");
String strNumberB = buf.readLine();
System.out.println("请输要执行的运算符(+、-、*、/)");
String operate = buf.readLine();
Operating operation = OperationFactory.createOperation(operate);
operation.numberA = Double.parseDouble(strNumberA);
operation.numberB = Double.parseDouble(strNumberB);
double result = operation.getResult();
System.out.println(strNumberA+operate+strNumberB+"="+result);
} catch (IOException e) {
System.out.println("输入异常!请重试");
e.printStackTrace();
} catch (NullPointerException e){
System.out.println("请输入运算的参数!");
e.printStackTrace();
} catch (NumberFormatException e){
System.out.println("输入的数字格式不正确!");
e.printStackTrace();
} catch (MyException e){
System.out.println(e.getMessage());
e.printStackTrace();
} catch (Exception e){
System.out.println("系统异常!");
}
}
}
Program:程序入口
public class Program {
public static void main(String[] args){
while (true){
new Console().inputAndShow();
}
}
}
总结:
此项目优势:
1,项目符合ocp原则,如果要加入求根或者别的计算方式。直接创建类写单独的计算逻辑即可。
2,使用简单工厂,使控制和计算通过工厂达到松耦合的状态。
以上总结属于个人观点!望各位多多指点!