我可以使用策略模式来实现以下逻辑: 所以,想象学费是根据学生的整体表现来计算的,例如,如果学生有一个整体平均分大于70分,他的学费将减少70%。依此类推。如果平均分为50折优惠,其他情况下不予折扣。所以有不同的策略来计算折扣,这取决于平均分。 如何在Java代码中实现这一点? 我想会有学生类,将有方法来计算平均分,界面TuitionFeeCalculator和三种策略:70persentDiscount,50%的折扣和noDiscount实施TuitionFeeCalculator。策略设计模式在大学内联网系统开发中的使用案例
回答
假定这只是一类的运动,因为你永远不会实现一个策略模式的东西简单,但你正在寻找的是这样的:
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));
}
但这不是战略模式的正确用法。 FeeCalculator必须是学生的成员。 – brummfondel
它并不重要,但如果你想这样做,只需要改变TuitionFeeCalculator的构造函数的double tuitionFee参数(和tf属性),并在学生类中创建一个方法,也许称为calculate( )执行feeCalculator.calculateFee(fee)方法调用。 – palako
我不在乎,但他的老师可能会。 – brummfondel
可能有人检查这些代码,并告诉我如果有什么问题
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.7意味着你支付70%,而不是你折扣70%。你需要乘以(1-0.7)。 – palako
- 1. PHP网站开发设计策略
- 2. 新的设计模式/设计策略
- 3. 策略设计模式
- 4. Multipe策略设计模式
- 5. 在策略模式中设置策略
- 6. MEF中的设计模式策略
- 7. 设计模式 - 策略模式
- 8. 策略设计模式中不同具体策略之间的依赖关系?
- 9. 我的案例是否使用策略或命令模式?
- 10. 使用Hibernate命名策略生成模式的案例更改
- 11. 内联网系统
- 12. 如何实施策略设计模式?
- 13. C#策略模式设计问题
- 14. 嵌套策略设计模式
- 15. Javascript策略设计模式问题
- 16. OpenCart模板设计策略
- 17. 策略设计模式 - 在计数器策略之间进行选择
- 18. Akka Supervisor策略 - 正确使用案例
- 19. 学习系统设计
- 20. C#/ Web开发学习策略
- 21. 策略使用IOC容器的设计模式 - Ninject专门为
- 22. 网页开发设计模式列表?
- 23. 在phantomjs中使用策略模式
- 24. 游戏设计中的组件模型与策略模式
- 25. 策略设计模式(使用参数方法) - JAVA
- 26. 如何设计学校账单系统数据库模式?
- 27. 设计模式 - 策略与桥梁(重叠设计)
- 28. Java中使用策略模式的Emailer
- 29. C++内联模板策略功能
- 30. 好的设计模式系统重写?
你试过了什么? – developer
我想组成uml图,但我不清楚应该创建什么类。我想我可能会使用Simple Factory来选择正确的TuitionFeeCalculator实现 – FPQ