`
bxf12315
  • 浏览: 26272 次
  • 性别: 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  
晕了,怎么能吧这篇文章转到论坛里啊!

相关推荐

Global site tag (gtag.js) - Google Analytics