Java是一种面向对象的语言,那么什么是面向对象,我猜会有融会贯通之人留下一句:“万物皆对象”,飘然而去。如果只是记住Java是面向对象的语言此外还有面向过程的语言这样的一句话,让人觉得很不舒服。面向对象是一种思想,其三大特征是封装、继承、多态。用来降低耦合度、提高代码复用性、灵活性、易扩展。
此处借用一下《大话设计模式》的简单工厂模式的案例来说明一下:(也可以直接去看原文)
原文将面向过程与面向对象,比作雕版印刷术和活字印刷术。
题目:请用任意一种面向对象语言实现一个计算器控制台程序,要求输入两个数和运算符号,得到结果。
import java.util.Scanner;
/**
* 目前代码实现计算器是没问题了,但是要用面向对象的编程方法去实现。比如计算器这个
* 程序,先要求输入两个数和运算符号,然后根据运算符号判断选择如何运算,得到结果,
* 这本身没错,但这样的思维却使得我们的程序只为满足当前的需求,程序不容易维护,不容
* 易扩展,更不容易复用。从而达不到高质量代码的要求。
*/
public class Program2 {
public static void main(String[] args) {
Scanner scanner =new Scanner(System.in);
try {
System.out.println("请输入数字A:");
String strNumberA = scanner.nextLine();
System.out.println("请选择运算符号(+、-、*、/):");
String strOperate = scanner.nextLine();
System.out.println("请输入数字B:");
String strNumberB = scanner.nextLine();
String strResult ="请检查输入格式";
switch (strOperate){
case "+":
strResult = Double.valueOf(strNumberA) + Double.parseDouble(strNumberB) +"";
break;
case "-":
strResult = Double.valueOf(strNumberA) - Double.parseDouble(strNumberB) +"";
break;
case "*":
strResult = Double.valueOf(strNumberA) * Double.parseDouble(strNumberB) +"";
break;
case "/":
if(!"0".equals(strNumberB))
strResult = Double.valueOf(strNumberA) / Double.parseDouble(strNumberB) +"";
else
strResult ="除数不能为0";
break;
}
System.out.println("结果是:" + strResult);
}catch (Exception ex){
System.out.println("你输入的有错:"+ex.getMessage());
}
scanner.close();
}
}
上面的代码并没有用面向对象的思想,使程序只为满足当前的需求,不易维护,不易扩展,更不易复用。
通过面向对象的思想,考虑封装、继承。多态把程序的耦合度降低解决上面的痛点。下面将业务罗杰与界面逻辑分开,降低它们之间的耦合度,使其可以达到易维护、易扩展的目的。
/**
* 运算类
* 对运算过程进行了封装
*/
public class Operation {
public static String getResult(double numberA,double numberB,String operate){
String result = "格式有误,请检查!";
switch (operate){
case "+":
result = numberA + numberB + "";
break;
case "-":
result = numberA - numberB + "";
break;
case "*":
result = numberA * numberB + "";
break;
case "/":
if (numberB!=0)
result = numberA / numberB + "";
else
result = "除数不能为0";
break;
}
return result;
}
}
import java.util.Scanner;
/**
* 客户端代码
* 完成了将计算器的封装的调用
*/
public class Program {
public static void main(String[] args) {
Scanner s1 = new Scanner(System.in);
Scanner s2 = new Scanner(System.in);
try {
System.out.println("请输入数字A:");
double numberA = s1.nextDouble();
System.out.println("请选择运算符号(+、-、*、/):");
String strOperate = s2.nextLine();
System.out.println("请输入数字B:");
double numberB = s1.nextDouble();
String result = "";
result = Operation.getResult(numberA, numberB, strOperate);
System.out.println(numberA + strOperate + numberB + "的结果是:" + result);
}catch (Exception ex){
System.out.println(ex.getMessage());
}
s1.close();
s2.close();
}
}
上述两页代码使用了面向对象中的封装,将运算与界面分开通过调用来完成运算从而更灵活。
下面通过简单工厂模式完成,继承,封装,多态。
/**
* 运算类的封装和继承,注意子类对父类的调用。
*/
public class Operation {
private double _numberA ;
private double _numberB ;
public double get_numberA() {
return _numberA;
}
public void set_numberA(double _numberA) {
this._numberA = _numberA;
}
public double get_numberB() {
return _numberB;
}
public void set_numberB(double _numberB) {
this._numberB = _numberB;
}
public String getResult(){
String result = "格式不正确";
return result;
}
}
class OperationAdd extends Operation{
@Override
public String getResult(){
String result = get_numberA() + get_numberB() + "";
return result;
}
}
class OperationSub extends Operation{
@Override
public String getResult(){
String result = get_numberA() - get_numberB() + "";
return result;
}
}
class OperationMul extends Operation{
@Override
public String getResult(){
String result = get_numberA() * get_numberB() + "";
return result;
}
}
class OperationDiv extends Operation{
@Override
public String getResult(){
String result = "格式不正确";
if(get_numberB() == 0)
result = "除数不能为0";
else
result = get_numberA() / get_numberB() + "";
return result;
}
}
/**
* 简单工厂模式来实例化对应的实例
*/
public class OperationFactory {
public static Operation createOperate(String operate){
Operation oper = null;
switch (operate){
case "+":
oper = new OperationAdd();
break;
case "-":
oper = new OperationSub();
break;
case "*":
oper = new OperationMul();
break;
case "/":
oper = new OperationDiv();
break;
}
return oper;
}
}
import java.util.Scanner;
/**
* 封装继承后的计算器
*/
public class Program {
public static void main(String[] args) {
Scanner s1 = new Scanner(System.in);
Scanner s2 = new Scanner(System.in);
try {
Operation oper;
System.out.println("请输入第一个数字:");
double numberA = s1.nextDouble();
System.out.println("请选择运算符(+、-、*、/):");
String strOperate = s2.nextLine();
System.out.println("请输入第二个数字:");
double numberB = s1.nextDouble();
oper = OperationFactory.createOperate(strOperate);
oper.set_numberA(numberA);
oper.set_numberB(numberB);
String result = oper.getResult();
System.out.println("计算结果是:" + result);
}catch (Exception ex){
System.out.println(ex.getMessage());
}
s1.close();
s2.close();
}
}
跟着上面三个改进思考,代码各司其职,只需调用便可完成想要的过程,而不需要亲力亲为,是不是很方便了呢。