如何避免使用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分支问题的有效手段,特别是在大型项目和复杂业务逻辑中。通过将策略对象与具体业务逻辑解耦,我们可以构建更加灵活、可扩展的系统。在实际开发中,结合Spring Boot...
策略模式就是为了解决这类问题而诞生的,它将每种算法封装到具有共同接口的独立类中,使得它们可以互换,从而让程序在运行时可以选择并使用合适的算法。 策略模式的核心概念包括上下文(Context)、策略(Strategy)和...
### 策略模式 Strategy Pattern #### 概述 策略模式是一种行为设计模式,它使得算法可以在运行时被更改。这种模式允许一个类的行为或其算法在运行时根据需要进行改变,通过这种方式,我们可以轻松地扩展不同的算法...
Java设计模式中的策略模式是一种行为设计模式,它允许在运行时选择算法或策略,从而提供了更大的灵活性。策略模式的核心在于将算法封装到独立的可互换的策略类中,使得算法的变化不会影响到使用算法的客户端代码。 ...
策略模式通过将每种策略封装为独立的对象,可以避免这种情况,使得代码更易于理解和扩展。相对不变的部分是策略的接口和上下文,它们定义了策略的公共行为和使用方式;相对改变的部分是具体的策略实现,可以根据业务...
当面对必须使用多个分支的场景时,应当考虑使用策略模式、状态模式或其他设计模式来代替大量的if-else或switch-case语句。例如,将消息渲染逻辑抽象成独立的函数,根据消息类型或消息的重要性来调用相应的函数。这样...
在Java编程语言中,`if`嵌套语句是一种常用逻辑控制结构,它允许程序员根据不同的条件执行不同的代码块。...在实际编程过程中,可以考虑使用`switch`语句或策略模式等替代方法,以减少过度的嵌套。
在JavaScript中,策略模式可以用来实现一些复杂的条件逻辑,避免使用if-else或switch语句。策略模式可以简化代码,并且使得算法易于切换和扩展。 策略模式的优点包括: - 开闭原则:策略模式符合开闭原则,即对...
2.设计模式是比 J2EE 等框架软件更小的体系结构,J2EE 中许多具体程序都是应用设计模式来完成的,当你深入到 J2EE 的内 部代码研究时,这点尤其明显,因此,如果你不具备设计模式的基础知识(GoF 的设计模式),你很难...
通过维护一个映射表(filemap),将不同的文件类型映射到相应的存储服务,避免了在代码中大量使用if-else语句,提高了代码的可读性和可扩展性。 3. ThreadLocal与会话跟踪技术 在微服务环境中,会话跟踪技术是必不...
- **避免过多的if嵌套**:过多的嵌套可能导致代码难以阅读和理解,可以尝试重构代码,使用策略模式或函数组合来简化逻辑。 - **使用开关(switch)**:当有多个条件分支时,`switch` 语句通常比多个 `if...else if...
在Android开发中,策略模式同样有着广泛的应用,可以帮助我们编写更加灵活、可扩展的代码,避免大量if-else语句导致的代码混乱。 策略模式的核心思想是将算法或策略封装到独立的类中,这些类都实现了相同的接口或...
- 需要避免硬编码的条件语句:通过策略对象替换复杂的if-else或switch语句,使得代码更加清晰。 - 当算法需要由用户或配置文件动态指定时:例如用户可以选择不同的优惠策略。 5. **策略模式的总结** 策略模式...
例如,工厂方法模式通过将对象的实例化延迟到子类,避免了在程序中大量使用条件语句(如if-else或switch-case)进行对象创建。这种模式特别适用于产品族中扩展新产品的场景,因为添加新产品时不需要修改现有的代码。...
- 消除了一些if/else条件语句,使用策略模式可以避免使用条件语句来选择合适的行为。 在PHP中,策略模式可以通过定义接口和具体类来实现。例如,可以定义一个排序接口,然后分别实现快速排序、归并排序等具体策略类...
这种模式可以避免在代码中使用大量的if-else或switch语句,使得程序更加灵活且易于扩展。 2. **工厂模式**: 工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,当我们创建对象时,...
Java策略模式是一种设计模式,它允许程序在运行时动态地改变对象的行为。策略模式的核心思想是将算法封装在独立的策略类中,使得算法的变化不会影响到使用算法的客户端。这种模式有效地避免了硬编码的条件分支语句,...
在JavaScript中,策略模式的应用可以帮助我们处理复杂的逻辑选择,避免过多的条件分支(if-else语句),提高代码的可读性和可维护性。 在传统的编程方式中,比如在示例1中,我们直接在`calculateBonus`函数内部通过...
在PHP中,策略模式的应用可以帮助我们避免在代码中使用大量的if...else语句,提高代码的可维护性和灵活性。接下来,我们将深入探讨策略模式的概念、原理以及如何在PHP中实现。 策略模式的核心思想是定义一系列的...