java看完基础看什么_搞完Java项目,再看Java基础

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();

}

}

跟着上面三个改进思考,代码各司其职,只需调用便可完成想要的过程,而不需要亲力亲为,是不是很方便了呢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值