先来熟悉一下面向对象的三大特征:封装,继承,多态。
我们原来的所写的程序,不容易维护,灵活性差,不容易扩展,更谈不上复用。
学习了面向对象的编程思想,就开始考虑通过封装,继承,多态把程序的耦合度降低,开始使用设计模式使得程序更加灵活。并且易于复用。
例如一个非常简单的计算器
public class TestController {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入数字A");
int a = scanner.nextInt();
System.out.println("请输入运算符");
String c = scanner.next();
System.out.println("请输入数字B");
int b = scanner.nextInt();
if (c.equals("+")){
System.out.println("结果:" + (a+b));
}
if (c.equals("-")){
System.out.println("结果:" + (a-b));
}
if (c.equals("*")){
System.out.println("结果:" + (a*b));
}
if (c.equals("/")){
System.out.println("结果:" + (a/b));
}
}
}
我们先来看看这个代码的几处问题,
1.命名不规范ABC不知道是什么
if(){}
if(){}
后面的判断也重复三次
3.当除法的除数为0报错。
下面我们来进行一下优化
首先写一个父类
package wcfb.factory;
/**
* 运算类
*/
public class Operation {
private double numberA = 0;
private double numberB = 0;
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 double getResult(){
double result = 0;
return result;
}
}
然后加减乘除分别继承这个父类
package wcfb.factory;
/**
* 加法运算
*/
public class OperationAdd extends Operation {
@Override
public double getResult(){
double result = 0;
result = getNumberA() + getNumberB();
return result;
}
}
package wcfb.factory;
/**
* 减法计算
*/
public class OperationSub extends Operation {
@Override
public double getResult(){
double result = 0;
result = getNumberA() - getNumberB();
return result;
}
}
package wcfb.factory;
/**
* 乘法运算
*/
public class OperationMul extends Operation {
@Override
public double getResult(){
double result = 0;
result = getNumberA() * getNumberB();
return result;
}
}
package wcfb.factory;
/**
* 除法计算
*/
public class OperationDiv extends Operation {
@Override
public double getResult(){
double result = 0;
if (getNumberB() == 0){
System.out.println("除数不能为0");
return result;
}
result = getNumberA() / getNumberB();
return result;
}
}
下面是工厂模式 用来生成具体运算方法
package wcfb.factory;
/**
* 运算符工厂
*/
public class OperationFactory {
public static Operation createOperation(String operate){
Operation operation = null;
switch (operate){
case "+":
operation = new OperationAdd();
break;
case "-":
operation = new OperationSub();
break;
case "*":
operation = new OperationMul();
break;
case "/":
operation = new OperationDiv();
break;
}
return operation;
}
}
主函数
package wcfb.factory;
import java.util.Scanner;
/**
* 工厂模式
*/
public class Main {
public static void main(String[] args) {
Operation operation;
Scanner scanner = new Scanner(System.in);
System.out.println("请输入数字A");
double numberA = scanner.nextDouble();
System.out.println("请输入运算符");
String operate = scanner.next();
System.out.println("请输入数字B");
double numberB = scanner.nextDouble();
operation = OperationFactory.createOperation(operate);
operation.setNumberA(numberA);
operation.setNumberB(numberB);
double result = operation.getResult();
System.out.println(result);
}
}
至此我们就用了简单的工厂模式写了一个简单的例子
网友评论