简体   繁体   中英

Strategy Design Pattern use case in the development of University Intranet system

Can I use the strategy pattern to implement the following logic: So, imagine the tuition fee is calculated based on the overall student performance, for example if the student has an overall average mark more than 70, his tuition fee will be 70% less. And so on.. if average mark is 50 than 50% discount, in other cases no discount. So there are different strategies to calculate discount that vary depending on the average mark. How can I implement this in Java code? I suppose that there will be Student class that will have method to calculate the average mark, interface TuitionFeeCalculator and three strategies: 70persentDiscount,50%discount and noDiscount implementing TuitionFeeCalculator.

Assuming this is just a class exercise, since you would never implement a strategy pattern for something that simple, but what you are looking for is something like:

public interface TuitionFeeCalculator {
    double calculateFee(double fee);
}

public class Fee70 implements TuitionFeeCalculator {
    @Override
    public double calculateFee(double fee) {
        return fee * (1-0.7);
    }
}

public class Fee50 implements TuitionFeeCalculator {
    @Override
    public double calculateFee(double fee) {
        return fee * (1-0.5);
    }
}

public class FeeNoDiscount implements TuitionFeeCalculator {
    @Override
    public double calculateFee(double fee) {
        return fee;
    }
}

public class Student {
    double tf;

    public Student(double tuitionFee) {
        this.tf = tuitionFee;
    }
}

public static void main(String[] args) {

    double averageMark = 90;
    double fee = 10000;

    TuitionFeeCalculator feeCalculator;
    if(averageMark >70) {
        feeCalculator = new Fee70();
    } else if (averageMark > 50) {
        feeCalculator = new Fee50();
    } else {
        feeCalculator = new FeeNoDiscount();
    }

    Student s = new Student(feeCalculator.calculateFee(fee));
}

Could someone check this code and tell me if there is something wrong

 public class StrategyDemo
 {

  public static void main(String[] args)
  {
    Student s = new Student();
    TuitionFee fee = new TuitionFee();
    fee.setTuitionFee(5000);
    StudentStatus status = new StudentStatus(s);
    CalculatorSelectorFactory calc = new CalculatorSelectorFactory(status.getStatus());
    TuitionFeeCalculator tfc = calc.getCalculator();
    double newFee = tfc.calculate();



  }
}


public class StudentStatus
{
  private Student student;

  public StudentStatus(Student student){
    this.student = student;
  }
  public List<Module> getAllModules(){
        //query the database and get all modules a particular student is enrolled for
        return modules; //return list of modules
  }
  public int getStatus(){
    int total = 0;
    int count = 0;
    for(Module m: getAllModules()){
        total += m.getMark();
        count++;
    }
    int average = total/count;
    return average;
  }
}
public class TuitionFee{
    private double tuitionFee;

    public void setTuitionFee(double tuitionFee){
        this.tuitionFee = tuitionFee;
    }
    public double getTuitionFee(){
        return tuitionFee;
    }
}
public interface TuitionFeeCalculator{
    public double calculate();
}
public class Discount70 implements TuitionFeeCalculator{
    @Override
    public double calculate(TuitionFee tuitionFee){
        double discount = tuitionFee * 0.7; //70% discount
        return tuitionFee-discount;
    }
}
public class Discount50 implements TuitionFeeCalculator{
    @Override
    public double calculate(TuitionFee tuitionFee){
        double discount = tuitionFee * 0.5; //50% discount
        return tuitionFee-discount;
    }
}
public class NoDiscount implements TuitionFeeCalculator{
    @Override
    public double calculate(TuitionFee tuitionFee){
        return tuitionFee; //no discount
    }
}

public class CalculatorSelectorFactory{
    TuitionFeeCalculator tfc;
    public CalculatorSelectorFactory(int status){
        if(status>=70){
          tfc=new Discount70();
        }
        else if(status>=50){
          tfc = new Discount50();
        }
        else{
          tfc = new NoDiscount();
        }       
    }
    public TuitionFeeCalculator getCalculator(){
        return tfc;
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM