和风细雨

世上本无难事,心以为难,斯乃真难。苟不存一难之见于心,则运用之术自出。

薪水计算续

本文是 "从薪水计算的例子看一段程序在不同环境中的变化 " 的续文.

如果需求发生如下变化:
 

如果说国家改变了公民福利制度,具体就是500元以下的每人补充300,超过20000元的在原有基础上再扣除20%,请问该如何编程?

具体等级税率:

等级                             税率                            额定扣除数

不超过500               5%                              0 (低保每人补助300)

大于500小于2000       10%                             25

大于2000小于5000     15%                             125

大于5000小于20000    20%                             375

超过20000               25%                             1375(在计算完的基础上再乘以80%)

 

这时原有公式就不适用了,我们没有必要回到分支语句的老路上去,将计算公式归并成SalaryGrade的一个函数getSalaryAfterTax,然后从SalaryGrade分别扩展两个类HigherSalaryGrade和LowerSalaryGrade,然后分别实现各自的getSalaryAfterTax函数即可.

代码如下:
SalaryGrade类:
package com.sitinspring.oostyleadv;

/**
 * 工资等级类
 * 
@author sitinspring(junglesong@gmail.com)
 *
 
*/

public class SalaryGrade {
    
// 月薪界限
    protected double grade;

    
// 税率
    protected double ratio;

    
// 折扣
    protected double discount;

    
public SalaryGrade(double grade, double ratio, double discount) {
        
this.grade = grade;
        
this.ratio = ratio;
        
this.discount = discount;
    }

    
    
public double getSalaryAfterTax(double salary){
        
return salary*(1-ratio)-discount;
    }


    
public SalaryGrade() {
        
this(0.0f0.0f0.0f);
    }


    
public double getDiscount() {
        
return discount;
    }


    
public double getGrade() {
        
return grade;
    }


    
public double getRatio() {
        
return ratio;
    }

}

HigherSalaryGrade类:
package com.sitinspring.oostyleadv;

/**
 * 超高收入工资等级类
 * 
@author sitinspring(junglesong@gmail.com)
 *
 
*/

public class HigherSalaryGrade extends SalaryGrade{
    
public HigherSalaryGrade(double grade, double ratio, double discount) {
        
super(grade,ratio,discount);
    }

    
    
public double getSalaryAfterTax(double salary){
        
return (salary*(1-ratio)-discount)*0.8;
    }


    
public HigherSalaryGrade() {
        
this(0.0f0.0f0.0f);
    }

}

LowerSalaryGrade类:
package com.sitinspring.oostyleadv;

/**
 * 低保工资等级类
 * 
@author sitinspring(junglesong@gmail.com)
 *
 
*/

public class LowerSalaryGrade extends SalaryGrade{
    
public LowerSalaryGrade(double grade, double ratio, double discount) {
        
super(grade,ratio,discount);
    }

    
    
public double getSalaryAfterTax(double salary){
        
return salary*(1-ratio)-discount+300;
    }


    
public LowerSalaryGrade() {
        
this(0.0f0.0f0.0f);
    }

}

SalaryCaculator类:
package com.sitinspring.oostyleadv;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * 工资计算类
 * 
@author sitinspring(junglesong@gmail.com)
 *
 
*/

public class SalaryCaculator{
    
private List<SalaryGrade> grades;
    
    
    
public SalaryCaculator(){
        grades
=new ArrayList<SalaryGrade>();
        
        grades.add(
new LowerSalaryGrade(500,0.05,0));
        grades.add(
new SalaryGrade(2000,0.1,25));
        grades.add(
new SalaryGrade(5000,0.15,125));
        grades.add(
new SalaryGrade(20000,0.20,375));
        grades.add(
new HigherSalaryGrade(99999999,0.25,1375));
    }

    
    
// OO化的查询方法
    public double getSalaryAfterTax(double total){
        SalaryGrade taxGrade
=null;
        
        
for(Iterator it=grades.iterator();it.hasNext();){
            taxGrade
=(SalaryGrade)it.next();
            
            
if(total>taxGrade.getGrade()){
                
continue;
            }

            
else{
                
break;
            }

        }

        
        
return taxGrade.getSalaryAfterTax(total);
    }

}

Main:
package com.sitinspring.oostyleadv;

/**
 * Main函数所在的类
 * 
@author sitinspring(junglesong@gmail.com)
 *
 
*/

public class Main{
    
public static void main(String[] args){    
        SalaryCaculator caculator
=new SalaryCaculator();
        
        
for(double total=100;total<30000;total+=1000){
            System.out.println(
"税前薪水="+total+" 税后薪水="+caculator.getSalaryAfterTax(total));
        }
        
    }

}

代码下载:
http://www.blogjava.net/Files/sitinspring/TaxCaculator20071115120519.rar

posted on 2008-02-22 10:32 和风细雨 阅读(154) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航: