笔记资源来自《大话设计模式》。
本次的例子是写一个简单的计算器,只要实现加减乘除即可。一般人的写法一定是用switch语句来判断用户输入的符号,然后分别进行不同的操作。
这样写固然可以实现功能,却不是面向对象编程,面向对象应该将业务进行封装。
有人说,这么简单一个计算器,根本不需要进行封装。那好,如果我叫你在你的计算器中加入求平方根的运算,你一定会在你的switch语句中加入一个节点,判断是否是平方根符号。
的确,这样是没错的,但这种思想是不对的。
《大话设计模式》这本书中有一个例子说得很好,假设现在老板叫你做的不是一个计算器,而是要求你为公司的薪资管理系统做维护。公司人员有技术人员,市场销售人员,经理,他们都是拿月薪,或者股份分成,销售提成等。现在公司要求你加入一种兼职工作人员的薪资算法(时薪)。
按照你写计算器的那种方法,用switch语句来判断工作人员是属于哪一种,那公司让你维护薪资管理系统的时候,必须把整个switch包含的代码全部给你。如果你心中小算盘一打,“TMD,公司给我工资这么低。”于是你除了增加兼职薪资算法之后,在技术人员算法中加了一句:
这就体现了封装的重要性,将不同的算法分离开来,修改其中一个不会影响另外的几个。
最后再写一个工厂类:
这样的做法不仅把不同算法分离开,互不影响,而且把界面和算法隔离,不管你用控制台程序,windows窗口程序,Web程序或者是手机程序,都可以用这段代码来实现计算器的功能。
本次的例子是写一个简单的计算器,只要实现加减乘除即可。一般人的写法一定是用switch语句来判断用户输入的符号,然后分别进行不同的操作。
这样写固然可以实现功能,却不是面向对象编程,面向对象应该将业务进行封装。
有人说,这么简单一个计算器,根本不需要进行封装。那好,如果我叫你在你的计算器中加入求平方根的运算,你一定会在你的switch语句中加入一个节点,判断是否是平方根符号。
的确,这样是没错的,但这种思想是不对的。
《大话设计模式》这本书中有一个例子说得很好,假设现在老板叫你做的不是一个计算器,而是要求你为公司的薪资管理系统做维护。公司人员有技术人员,市场销售人员,经理,他们都是拿月薪,或者股份分成,销售提成等。现在公司要求你加入一种兼职工作人员的薪资算法(时薪)。
按照你写计算器的那种方法,用switch语句来判断工作人员是属于哪一种,那公司让你维护薪资管理系统的时候,必须把整个switch包含的代码全部给你。如果你心中小算盘一打,“TMD,公司给我工资这么低。”于是你除了增加兼职薪资算法之后,在技术人员算法中加了一句:
if(员工是我){
salary = salary * 1.5;
}
这下倒好,自己给自己加工资。(小心被请去公安局喝茶)这就体现了封装的重要性,将不同的算法分离开来,修改其中一个不会影响另外的几个。
先写一个Operation类:
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;
}
}
再写一个加法类OperationAdd类继承它: public class OperationAdd extends Operation {
public double getResult(){
double result = 0;
result = this.getNumberA() + getNumberB();
return result;
}
}
减法类: public class OperationSub extends Operation {
public double getResult(){
double result = 0;
result = this.getNumberA() - getNumberB();
return result;
}
}
乘法,除法,根运算等也是一样,分别写个类继承运算类Operation,这样就将不同的运算方法分离开,互不影响。最后再写一个工厂类:
public class OperationFactory {
public static Operation createOperation(char operate){
Operation oper = null;
switch(operate){
case '+':
oper = new OperationAdd();
break;
case '-':
oper = new OperationSub();
break;
}
return oper;
}
}
用工厂来实例化出合适的对象,通过多态,返回父类的方式实现了计算器的结果。 Operation oper;
oper = OperationFactory.createOperation('+');
oper.setNumberA(1);
oper.setNumberB(3);
double result = oper.getResult();
System.out.println(result);
这样的做法不仅把不同算法分离开,互不影响,而且把界面和算法隔离,不管你用控制台程序,windows窗口程序,Web程序或者是手机程序,都可以用这段代码来实现计算器的功能。