使用设计模式设计的计算器
最近读《大话设计模式》有感,正好以前写过一个计算器,当时感觉写的很费力,而且要添加和修改某些功能总是要修改全部代码,十分吃力。现在倒知道了自己的不足之处,于是按照有规划地设计来重写一遍计算器。
下面是算法的图解,也是对我的代码的一个回顾和分析。
由于界面部分代码没有新意,于是我只介绍一下自己的逻辑部分:
先贴出代码
Calculator.java:
package SimpleFactory;
public class Calculator{
private String operator;
private double param1, param2;
public void setParam(String operator, double param1, double param2){
this.operator = operator;
this.param1 = param1;
this.param2 = param2;
}
public double calc() throws ExcepZeroDiv{
Factory fac = new Factory(operator);
Operation oper = fac.creatOper();
oper.setParam(param1, param2);
return oper.getResult();
}
}
class Factory {
private String operator;
public Factory(String operator){
this.operator = operator;
}
public Operation creatOper(){
Operation oper = null;
try {
oper = (Operation) Class.forName(operator).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
System.out.println("此操作不存在"+operator);
e.printStackTrace();
}
return oper;
}
}
Calculator类是逻辑算法部分的主类,他负责将计算的参数(2个),计算的方法(类名,string形式)传给工厂类Factory
Factory直接根据类名初始化一个算法类(Class.forName(String name)),这里用到了一个接口Operation
package SimpleFactory;
public interface Operation {
void setParam(double num1 ,double num2);
double getResult() throws ExcepZeroDiv;
}
由于设置参数的方法都是一样的,于是定义了一个抽象类AbstractOper
package SimpleFactory;
public abstract class AbstractOper implements Operation{
protected double param_num1,param_num2;
public void setParam(double num1 , double num2) {
param_num1 = num1;
param_num2 = num2;
}
}
然后就可以自己随意定义算法类了
例如加法类OperAdd
package SimpleFactory;
public class OperAdd extends AbstractOper{
public double getResult() {
// System.out.println("加法..");
return this.param_num1+this.param_num2;
}
}
这样的话,每个类的作用就分开了,而且几乎不用更改(这里可以在每个终端算法类的类名前声明final),
这样的话,要增加某种功能,只要在界面代码上添加按钮,并将按钮的ActionCommand设置为该算法类的
类名,同时增加该算法类,以及实现该类的geyResult()方法了。
下面是程序演示:
顺便吐槽一句,为什么不能批量上传图片= =。