1. 程式人生 > >泛型和介面的方式設計一個計算器

泛型和介面的方式設計一個計算器

首先,定義一個介面,進行統一和約束程式碼,

泛型在編寫時,是Object型別的,所以為了計算,把Object轉成字串進行計算,BigDecimal類對字串處理更加精確,計算時用BigDecimal類中的方法進行計算

public interface ICounter {
	public <T> BigDecimal add(T t1,T t2);//加法
	public <T> BigDecimal sub(T t1,T t2);//減法
	public <T> BigDecimal mul(T t1,T t2);//乘法
	public <T> BigDecimal div(T t1,T t2);//除法
}

然後定義實現類,實現該介面,重寫介面中的方法,實現類程式碼如下:

public class CounterImpl implements ICounter {

	@Override
	public <T> BigDecimal add(T t1, T t2) {
		BigDecimal num1 = new BigDecimal(t1.toString());
		BigDecimal num2 = new BigDecimal(t2.toString());
		BigDecimal result = num1.add(num2);
		return result;
	}

	@Override
	public <T> BigDecimal div(T t1, T t2) {
		BigDecimal num1 = new BigDecimal(t1.toString());
		BigDecimal num2 = new BigDecimal(t2.toString());
		BigDecimal result ;
        //因為遇到除不盡的時候會報錯,進行try/catch進行捕獲異常,並保留兩位小數處理
		try {
			result = num1.divide(num2);
		} catch (Exception e) {
			System.out.println("該公式除不盡,保留兩位小數");
			result = num1.divide(num2,2, BigDecimal.ROUND_HALF_DOWN);//四捨五入保留兩位小數
		} 
		return result;
	}

	@Override
	public <T> BigDecimal mul(T t1, T t2) {
		BigDecimal num1 = new BigDecimal(t1.toString());
		BigDecimal num2 = new BigDecimal(t2.toString());
		BigDecimal result = num1.multiply(num2);
		return result;
	}

	@Override
	public <T> BigDecimal sub(T t1, T t2) {
		BigDecimal num1 = new BigDecimal(t1.toString());
		BigDecimal num2 = new BigDecimal(t2.toString());
		BigDecimal result = num1.subtract(num2);
		return result;
	}


}

定義測試類進行測試:

效果如願以償,可以實現不同資料型別的計算的效果

來回修改太麻煩了?再補充一個方法:

介面中新增:

public <T> BigDecimal count(String symbol ,T t1,T t2);//字串代替運算子判斷並計算

實現類中新增:

	/**
	 * @desc 字串代替運算子判斷並計算
	 * @param symbol 運算子
	 * @param t1
	 * @param t2
	 * @return
	 */
	public <T> BigDecimal count(String symbol ,T t1,T t2){
		BigDecimal result = new BigDecimal(-1);//如果格式不正確返回-1
		if ("+".equals(symbol)) {
			result = add(t1, t2);
		} else if ("-".equals(symbol)) {
			result = sub(t1, t2);
		} else if ("*".equals(symbol)) {
			result = mul(t1, t2);
		} else if ("/".equals(symbol)) {
			result = div(t1, t2);
		} else {
			System.out.println("請輸入正確的運算子");
		}
		return result;
	}

再定義個測試類: