`
bxf12315
  • 浏览: 27140 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

如何借助“策略模式”才能避免程序中的if else

    博客分类:
  • java
阅读更多

如何避免使用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语句的东西,里面常常涉及到想策略模式。但是一直不明白向上面红色部分提及的如果判断的问题。

 

希望,高人帮我解答一二。

 

 

分享到:
评论
1 楼 bxf12315 2011-01-20  
晕了,怎么能吧这篇文章转到论坛里啊!

相关推荐

    策略模式消除if-else分支判断.zip

    综上所述,策略模式和工厂模式的结合是解决if-else分支问题的有效手段,特别是在大型项目和复杂业务逻辑中。通过将策略对象与具体业务逻辑解耦,我们可以构建更加灵活、可扩展的系统。在实际开发中,结合Spring Boot...

    02策略模式_设计模式_

    策略模式就是为了解决这类问题而诞生的,它将每种算法封装到具有共同接口的独立类中,使得它们可以互换,从而让程序在运行时可以选择并使用合适的算法。 策略模式的核心概念包括上下文(Context)、策略(Strategy)和...

    策略模式 Strategy Pattern

    ### 策略模式 Strategy Pattern #### 概述 策略模式是一种行为设计模式,它使得算法可以在运行时被更改。这种模式允许一个类的行为或其算法在运行时根据需要进行改变,通过这种方式,我们可以轻松地扩展不同的算法...

    Java设计模式之策略模式详解

    Java设计模式中的策略模式是一种行为设计模式,它允许在运行时选择算法或策略,从而提供了更大的灵活性。策略模式的核心在于将算法封装到独立的可互换的策略类中,使得算法的变化不会影响到使用算法的客户端代码。 ...

    2.StrategyModel.rar

    策略模式通过将每种策略封装为独立的对象,可以避免这种情况,使得代码更易于理解和扩展。相对不变的部分是策略的接口和上下文,它们定义了策略的公共行为和使用方式;相对改变的部分是具体的策略实现,可以根据业务...

    javascript 从if else 到 switch case 再到抽象

    当面对必须使用多个分支的场景时,应当考虑使用策略模式、状态模式或其他设计模式来代替大量的if-else或switch-case语句。例如,将消息渲染逻辑抽象成独立的函数,根据消息类型或消息的重要性来调用相应的函数。这样...

    Java中if嵌套语句实例.pdf

    在Java编程语言中,`if`嵌套语句是一种常用逻辑控制结构,它允许程序员根据不同的条件执行不同的代码块。...在实际编程过程中,可以考虑使用`switch`语句或策略模式等替代方法,以减少过度的嵌套。

    javascript设计模式 – 策略模式原理与用法实例分析

    在JavaScript中,策略模式可以用来实现一些复杂的条件逻辑,避免使用if-else或switch语句。策略模式可以简化代码,并且使得算法易于切换和扩展。 策略模式的优点包括: - 开闭原则:策略模式符合开闭原则,即对...

    二十三种设计模式【PDF版】

    2.设计模式是比 J2EE 等框架软件更小的体系结构,J2EE 中许多具体程序都是应用设计模式来完成的,当你深入到 J2EE 的内 部代码研究时,这点尤其明显,因此,如果你不具备设计模式的基础知识(GoF 的设计模式),你很难...

    第03章 从架构层面看设计模式02.pdf

    通过维护一个映射表(filemap),将不同的文件类型映射到相应的存储服务,避免了在代码中大量使用if-else语句,提高了代码的可读性和可扩展性。 3. ThreadLocal与会话跟踪技术 在微服务环境中,会话跟踪技术是必不...

    if.rar_If..._跳转

    - **避免过多的if嵌套**:过多的嵌套可能导致代码难以阅读和理解,可以尝试重构代码,使用策略模式或函数组合来简化逻辑。 - **使用开关(switch)**:当有多个条件分支时,`switch` 语句通常比多个 `if...else if...

    Android设计模式之策略模式详解

    在Android开发中,策略模式同样有着广泛的应用,可以帮助我们编写更加灵活、可扩展的代码,避免大量if-else语句导致的代码混乱。 策略模式的核心思想是将算法或策略封装到独立的类中,这些类都实现了相同的接口或...

    设计模式之策略模式

    - 需要避免硬编码的条件语句:通过策略对象替换复杂的if-else或switch语句,使得代码更加清晰。 - 当算法需要由用户或配置文件动态指定时:例如用户可以选择不同的优惠策略。 5. **策略模式的总结** 策略模式...

    Java常用设计模式.pdf

    例如,工厂方法模式通过将对象的实例化延迟到子类,避免了在程序中大量使用条件语句(如if-else或switch-case)进行对象创建。这种模式特别适用于产品族中扩展新产品的场景,因为添加新产品时不需要修改现有的代码。...

    PHP设计模式之 策略模式Strategy详解【对象行为型】

    - 消除了一些if/else条件语句,使用策略模式可以避免使用条件语句来选择合适的行为。 在PHP中,策略模式可以通过定义接口和具体类来实现。例如,可以定义一个排序接口,然后分别实现快速排序、归并排序等具体策略类...

    java设计模式大全

    这种模式可以避免在代码中使用大量的if-else或switch语句,使得程序更加灵活且易于扩展。 2. **工厂模式**: 工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,当我们创建对象时,...

    轻松掌握Java策略模式

    Java策略模式是一种设计模式,它允许程序在运行时动态地改变对象的行为。策略模式的核心思想是将算法封装在独立的策略类中,使得算法的变化不会影响到使用算法的客户端。这种模式有效地避免了硬编码的条件分支语句,...

    JavaScript设计模式之策略模式详解

    在JavaScript中,策略模式的应用可以帮助我们处理复杂的逻辑选择,避免过多的条件分支(if-else语句),提高代码的可读性和可维护性。 在传统的编程方式中,比如在示例1中,我们直接在`calculateBonus`函数内部通过...

    PHP实现的策略模式示例

    在PHP中,策略模式的应用可以帮助我们避免在代码中使用大量的if...else语句,提高代码的可维护性和灵活性。接下来,我们将深入探讨策略模式的概念、原理以及如何在PHP中实现。 策略模式的核心思想是定义一系列的...

Global site tag (gtag.js) - Google Analytics