使用设计模式设计的计算器

        最近读《大话设计模式》有感,正好以前写过一个计算器,当时感觉写的很费力,而且要添加和修改某些功能总是要修改全部代码,十分吃力。现在倒知道了自己的不足之处,于是按照有规划地设计来重写一遍计算器。

        下面是算法的图解,也是对我的代码的一个回顾和分析。
使用设计模式设计的计算器_第1张图片
         由于界面部分代码没有新意,于是我只介绍一下自己的逻辑部分:

         先贴出代码

        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()方法了。

下面是程序演示:


使用设计模式设计的计算器_第2张图片
 
使用设计模式设计的计算器_第3张图片
 
使用设计模式设计的计算器_第4张图片
 
使用设计模式设计的计算器_第5张图片
 
使用设计模式设计的计算器_第6张图片
 顺便吐槽一句,为什么不能批量上传图片= =。

 

你可能感兴趣的:(设计模式)