本博客例子均来自 大话设计模式一书!
1.首先定一个计算器:
实现简单的加减乘除
public class Compute1 {
public static void main(String args[]) {
try {
Scanner sc = new Scanner(System.in);
String result = "";
System.out.println("请输入一个数字A");
int numA = sc.nextInt();
System.out.println("请输入一个数字B");
int numB = sc.nextInt();
sc.nextLine();
System.out.println("请输入运算符+-*/");
String Opration = sc.nextLine();
switch (Opration) {
case "+":
result = String.valueOf(numA + numB);
break;
case "-":
result = String.valueOf(numA - numB);
break;
case "*":
result = String.valueOf(numA * numB);
break;
case "/":
if (numB == 0) {
result = "除数不能为0";
break;
}
result = String.valueOf(numA / numB);
break;
default:
break;
}
System.out.println(result);
} catch (Exception e) {
System.out.println("您的输入有误:" + e.getMessage());
}
}
}
此方法可以实现,但是耦合度高。如果要修改其中的一个操作,就要对整个类进行操作。且不易于复用,如果我要单用加法,或者减法是没法实现的。
这不是面向对象的特点。首先改造此方法:
1.2降低耦合度
public class Compute2 {
public static double GetResult(double numA,double numB,String operate) {
double result = 0.00;
switch(operate) {
case "+":
result = numA + numB;
break;
case "-":
result = numA - numB;
break;
case "*":
result = numA * numB;
break;
case "/":
result = numA / numB;
break;
}
return result;
}
}
public class Compute2Main {
public static void main(String args[]) {
try {
Compute2 compute2 = new Compute2();
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数字A");
double numA = sc.nextDouble();
System.out.println("请输入一个数字B");
double numB = sc.nextDouble();
sc.nextLine();
System.out.println("请输入运算符+-*/");
String Opration = sc.nextLine();
double getResult = Compute2.GetResult(numA, numB, Opration);
System.out.println(getResult);
}catch(Exception e) {
System.out.println("检查您的输入是否有误!"+e.getMessage());
}
}
}
这样分离了业务层和表现层。但是可复用的能力还是不行,达不到面向对象的特点。
继续改造1.2的代码。分离加减乘除,这样对于每个方法,我们都可以实现复用!!!
这才是面向对象的特点啊!
public interface OperationIn {
double GetResult(double numA,double numB) throws Exception;
}
public class sum implements OperationIn{
@Override
public double GetResult(double numA, double numB) throws Exception {
// TODO Auto-generated method stub
return numA+numB;
}
}
public class reduce implements OperationIn{
@Override
public double GetResult(double numA,double numB) {
return numA-numB;
}
}
public class cc implements OperationIn {
@Override
public double GetResult(double numA,double numB) {
return numA*numB;
}
}
public class cf implements OperationIn {
@Override
public double GetResult(double numA,double numB) throws Exception {
if(numB==0)
throw new Exception("除数不能为0");
return numA/numB;
}
}
复用以后,我们就可以开始建立我们的“工厂了”
public class OperationFactory {
public static OperationIn createOperation(String operate) {
OperationIn oper = null;
switch(operate) {
case "+":
oper = new sum();
break;
case "-":
oper = new reduce();
break;
case "*":
oper = new cc();
break;
case "/":
oper = new cf();
}
return oper;
}
}
通过运算符号来实现对象的实例化!!
这样,当我们增加功能的时候只需在工厂增加相应的switch分支即可
方便,复用,灵活,封装,多态提现的淋漓尽致
public class Main {
public static void main(String[] args) throws Exception {
try {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数字A");
int numA = sc.nextInt();
System.out.println("请输入一个数字B");
int numB = sc.nextInt();
OperationIn oper;
oper = OperationFactory.createOperation("-");
double result = oper.GetResult(numA, numB);
System.out.println(result);
}catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
uml类图如下
