2016-11-19 18 views
0

我可以使用策略模式來實現以下邏輯: 所以,想象學費是根據學生的整體表現來計算的,例如,如果學生有一個整體平均分大於70分,他的學費將減少70%。依此類推。如果平均分爲50折優惠,其他情況下不予折扣。所以有不同的策略來計算折扣,這取決於平均分。 如何在Java代碼中實現這一點? 我想會有學生類,將有方法來計算平均分,界面TuitionFeeCalculator和三種策略:70persentDiscount,50%的折扣和noDiscount實施TuitionFeeCalculator。策略設計模式在大學內聯網系統開發中的使用案例

+0

你試過了什麼? – developer

+0

我想組成uml圖,但我不清楚應該創建什麼類。我想我可能會使用Simple Factory來選擇正確的TuitionFeeCalculator實現 – FPQ

回答

1

假定這只是一類的運動,因爲你永遠不會實現一個策略模式的東西簡單,但你正在尋找的是這樣的:

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)); 
} 
+0

但這不是戰略模式的正確用法。 FeeCalculator必須是學生的成員。 – brummfondel

+0

它並不重要,但如果你想這樣做,只需要改變TuitionFeeCalculator的構造函數的double tuitionFee參數(和tf屬性),並在學生類中創建一個方法,也許稱爲calculate( )執行feeCalculator.calculateFee(fee)方法調用。 – palako

+0

我不在乎,但他的老師可能會。 – brummfondel

0

可能有人檢查這些代碼,並告訴我如果有什麼問題

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; 
    } 
} 
+0

以下沒關係,但要注意你是如何計算折扣的。乘以0.7意味着你支付70%,而不是你折扣70%。你需要乘以(1-0.7)。 – palako