题目:请用任意一种面向对象语言实现一个计算器控制台程序,要求输入两个数和运算符号,得到结果。
编程初学者,遇到问题时自觉地用计算机的方式去解决,即用计算机能够理解的逻辑来描述和解决问题及具体的求解过程。导致程序不易于维护、扩展和复用。
一、面向对象
1.活字印刷是面向对象的现实体现
在活字印刷出现之前,需要将印刷的内容刻到木板上,如果有修改、顺序调整等要求时,必须重新刻制印刷板。活字印刷是将汉字刻到一个一个小方块上,印刷文章时只需排版即可。那么刻到方块的汉字就是面向对象的体现。
面向对象的几点理解:
(1)一切皆是对象。
(2)类:具备某些共同特性(属性/数据)和行为(操作/功能)的实体的集合,是一个抽象的概念。
(3)对象:人们要研究的任何事物,是一个具体的概念。
(4)类是对象的抽象,对象是类的实例化。
2.面向对象的好处
通过封装、继承、多态降低程序的耦合度,设计模式可以使程序易于修改、易于扩展、便于复用。
面向对象的三大特性:
(1)封装性:将相同的属性和行为合并成新的数据类型(类)。通过对具体实施细节(属性)的隐藏(private),可以将接口(行为)和属性分离。易于修改
(2)继承性(extends):基础类(父类)不能满足我们的需求,可以通过继承父类创建新类(子类),在子类中添加新的功能。易于复用
(3)多态性:将接口从具体的实施细节(属性)中分离出来,即实现“是什么”与“做什么”两个模块的分离。易于扩展
二、简单工厂模式
到底要实例化谁,将来会不会增加新的实例化对象,比如增加开根运算,这是容易变化的地方,因此单独用一个类完成构造实例的过程,这个类就是工厂。题目的简单工厂UML图如下所示:
运算类
public class Operation { private double numberA = 0; private double numberB = 0; public double getResult(){ double result = 0; return result; } public double getNumberA() { return numberA; } public void setNumberA(double numberA) { this.numberA = numberA; } public double getNumberB() { return numberB; } public void setNumberB(double numberB) { this.numberB = numberB; } }
加减类
public class OperationAdd extends Operation{ public double getResult(){ double result = 0; result = getNumberA() + getNumberB(); return result; } }
public class OperationSub extends Operation{ public double getResult(){ double result = 0; result = getNumberA() - getNumberB(); return result; } }
简单运算工厂类
public class OperationFactory { public static Operation createOperate(String operate){ Operation operation = null; switch (operate){ case "+": operation = new OperationAdd(); break; case "-": operation = new OperationSub(); break; } return operation; } public static void main(String[] args) { Operation operation = createOperate("+"); if (operation != null){ operation.setNumberA(1); operation.setNumberB(2); System.out.println("运算结果:"+operation.getResult()); } } }