如何避免使用if else语句,这是个问题困扰自己很久了。
看过不少文章,貌似使用策略模式是较好的解决方法。
但是使用策略模式针的就能够避免if else吗?
一 首先我们假设一个场景。有这样一个txt文件。
name type worktime
huahua A 100
zhuzhu B 120
gougou C 130
renzha D 140
每列分别代表名字,类型,工作时间。然后通过他们不同的类型来区分进行工资计算。
A salary= worktime*50
C salary= worktime*70
B salary= worktime*60
D salary= worktime*80
然后将结果打印出来。
二 代码实现
1 当然了需要先定义一个vo
package com.aovid.mould;
public class Slave {
private String name;
private String type;
private int workTime;
private int salary;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public int getWorkTime() {
return workTime;
}
public void setWorkTime(int workTime) {
this.workTime = workTime;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
@Override
public String toString() {
return "Slave [name=" + name + ", type=" + type + ", workTime="
+ workTime + ", salary=" + salary + "]";
}
}
2 然后开始简单策略模式
package com.aovid.type;
import com.aovid.mould.Slave;
public interface Calculater {
public int calculateSalary(Slave s);
}
package com.aovid.type;
import com.aovid.mould.Slave;
public class CalculaterA implements Calculater {
@Override
public int calculateSalary(Slave s) {
// TODO Auto-generated method stub
return s.getWorkTime()*50;
}
}
package com.aovid.type;
import com.aovid.mould.Slave;
public class CalculaterB implements Calculater {
@Override
public int calculateSalary(Slave s) {
return s.getWorkTime()*60;
}
}
package com.aovid.type;
import com.aovid.mould.Slave;
public class CalculaterC implements Calculater {
@Override
public int calculateSalary(Slave s) {
return s.getWorkTime()*70;
}
}
package com.aovid.type;
import com.aovid.mould.Slave;
public class CalculaterD implements Calculater {
@Override
public int calculateSalary(Slave s) {
// TODO Auto-generated method stub
return s.getWorkTime()*80;
}
}
3 现在我觉得问题来了,如果我不通过if我怎么能知道每个Slave对象应该交给谁来处理。
(http://haobinbin.iteye.com/blog/553666
这是一个我刚看过的文章,感觉用它里面的方法也没办法解决上面的问题)。下面给出我自己简陋的方式。
package com.aovid.service;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import com.aovid.dao.SlaveDao;
import com.aovid.mould.Slave;
import com.aovid.type.Calculater;
import com.aovid.type.CalculaterA;
import com.aovid.type.CalculaterB;
import com.aovid.type.CalculaterC;
import com.aovid.type.CalculaterD;
public class SlaveService {
private HashMap<String, Class> map;
{
map = new HashMap<String, Class>();
map.put("A", CalculaterA.class);
map.put("B", CalculaterB.class);
map.put("C", CalculaterC.class);
map.put("D", CalculaterD.class);
}
public void showSalary() throws IOException, InstantiationException,
IllegalAccessException {
SlaveDao slaveDao = new SlaveDao();
List<Slave> slaveList = slaveDao.receiveAll();
for (Slave s : slaveList) {
s.setSalary(calculateByType(s));
System.out.println(s);
}
}
private int calculateByType(Slave s) throws InstantiationException,
IllegalAccessException {
Class calcuater = map.get(s.getType());
if (calcuater != null) {
Calculater c = (Calculater) calcuater.newInstance();
return c.calculateSalary(s);
}
return 0;
}
private int calculateByType_old(Slave s){
switch (key) {
case value:
break;
default:
break;
}
return 0;
}
}
注:为了让代码简单把所有的异常 都扔出去了。没做啥处理。
其实,看了很多关于避免使用if else和switch语句的东西,里面常常涉及到想策略模式。但是一直不明白向上面红色部分提及的如果判断的问题。
希望,高人帮我解答一二。
分享到:
相关推荐
使用策略模式和工厂模式彻底消除if-else分支
利用策略模式取代代码中的if-else,提高代码可读性,利于维护扩展。
主要介绍了Java利用策略模式优化过多if else代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
代码中大量的 if else如何优化.doc
If else 策略模式处理方式 (日期类处理)
IF-ELSE条件语句的翻译程序设计(LR方法、输出四元式)
IF-ELSE条件语句的翻译程序设计(LR方法、输出四元式)
IF-ELSE条件语句的翻译程序设计(简单优先法、输出四元式)
if else 语句
python if-else 写在一行(csdn)————程序
模拟汽车模拟汽车模拟汽车模拟汽车模拟汽车模拟汽车模拟汽车模拟汽车模拟汽车模拟汽车模拟汽车模拟汽车模拟汽车模拟汽车模拟汽车模拟汽车模拟汽车模拟汽车模拟汽车模拟汽车模拟汽车模拟汽车模拟汽车模拟汽车模拟汽车...
if-elseif-else使用范例
IF-ELSE条件语句的翻译程序设计(LR方法、输出三地址表示)
用InputBox和If then Else,if elseif,SelectCase三种方法判断分支函数的应用程序,.net源代码.
对条件语句: IF 〈布尔表达式〉 THEN 〈赋值语句〉 ELSE〈赋值语句〉 (1)按给定的题目写出符合语法分析方法要求的文法和属性文法描述。 (2)按给定的题目给出语法分析方法的思想及分析表设计。 (3)按给定的题目给...
C语言中if-else语句的嵌套分析.pdf
delphi if else 语句使用方法
asp.net---- if else 语句
检查pascal程序代码begin和end,if和then和else匹配程序。