说明:最近本人尝试阅读《大话数据模式》,读书有入也得有出,因此特意写下一些归纳和总结。原书使用C#语言,我使用java代码进行复现。
何为面向对象编程?实现功能的代码有四个特点,可维护,可复用,可扩展,灵活性好。
为什么要用面向对象而非面向过程?面向过程的耦合度非常高,是面向功能开发,不是将功能抽象化,面向对象具有封装继承多态的三大特性,降低了程序的耦合度,灵活使用设计模式会让程序容易修改,并且易于复用。
举例实现:实现计算功能
面向过程开发public class ErrorExample {
public static void main(String[] args) {
System.out.println("请输入数字a,数字b");
Scanner sc = new Scanner(System.in);
double result = 0;
try{
double a = sc.nextDouble();
double b = sc.nextDouble();
System.out.println("请输入运算符ch");
char ch = sc.next().charAt(0);
switch (ch){
case '-': result = a-b;break;
case '+': result = a+b;break;
case '*': result = a*b;break;
case '/':
if(b!=0){
result = a/b;
}else {
System.out.println("除数不能为0");
}
break;
}
System.out.println("结果为: "+result);
}catch (Exception e){
System.out.println("您输入信息有误");
}
}
}
使用封装将界面和运算进行分离,使得代码可复用
运算器类
public class Operation {
public static double getResult(double a,double b,char ch){
double result = 0;
switch (ch){
case '-': result = a-b;break;
case '+': result = a+b;break;
case '*': result = a*b;break;
case '/': result = a/b;break;
}
return result;
}
}
界面类
public class Client {
public static void main(String[] args) {
System.out.println("请输入数字a,数字b");
Scanner sc = new Scanner(System.in);
double result = 0;
try{
double a = sc.nextDouble();
double b = sc.nextDouble();
System.out.println("请输入运算符ch");
char ch = sc.next().charAt(0);
Operation.getResult(a,b,ch);
System.out.println("结果为: "+result);
}catch (Exception e){
System.out.println("您输入信息有误");
}
}
}
事实上将界面和运算和分离已经很好了,但是运算代码还可以进一步分离,举例,我们进行加运算,却让减除乘都参与编译。如果将运算分离,我们可以修改其中一个算法,或者增加删除算法都不会影响到其他代码。
逻辑说明:定义一个操作类,里面可以设置数值,但是将运算分离,操作类中定义一个运算方法接口,具体的操作类继承操作类并实现接口。
使用简单工厂进行实例化对象。操作类
public abstract class Operation {
private double a;
private double b;
public double getA() {
return a;
}
public void setA(double a) {
this.a = a;
}
public double getB() {
return b;
}
public void setB(double b) {
this.b = b;
}
public abstract double getResult();
}
运算类
public class OperationAdd extends Operation{
@Override
public double getResult() {
double result = 0.0;
result = getA()+getB();
return result;
}
}
public class OperationDiv extends Operation{
@Override
public double getResult() {
double result = 0.0;
try {
result = getA()/getB();
}catch (Exception e){
System.out.println("除数不能为0");
}
return result;
}
}
public class OperationMul extends Operation{
@Override
public double getResult() {
double result = 0.0;
result = getA()*getB();
return result;
}
}
public class OperationSub extends Operation{
@Override
public double getResult() {
double result = 0.0;
result = getA()-getB();
return result;
}
}
简单工厂类,根据参数获取操作类对象
public class OperationFactory {
public static Operation createOperation(char ch){
Operation operation = null;
switch (ch){
case '-': operation = new OperationSub();break;
case '+': operation = new OperationAdd();break;
case '*': operation = new OperationMul();break;
case '/': operation = new OperationDiv();break;
}
return operation;
}
}
客户端
public class Client {
public static void main(String[] args) {
Operation operation = OperationFactory.createOperation('+');
operation.setA(1.0);
operation.setB(2.0);
double result = operation.getResult();
System.out.println("结果为:"+result);
}
}
使用idea生成UML图
)
个人体会:简单工厂模式是将类的功能继续细分,使得各部分代码都互不干扰,使得各代码可以复用。



