简单工程设计模式:实战

上午看来一篇大话设计模式的文章。颇有感触,借此机会。将自己的感悟。写录于此,以便日后翻阅!

项目目标:

       使用面向对象的语言实现一个计算器功能。

思考:计算器的功能,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,使用简单工厂,使控制和计算通过工厂达到松耦合的状态。

     以上总结属于个人观点!望各位多多指点!

猜你喜欢

转载自blog.csdn.net/qq_37151646/article/details/82589152