问题:在多个裁判负责打分的比赛中,每位裁判给一个选手一个分,选手的最后得分根据全体裁判的打分而计算出来。请给出集中选手得分的评分方案(策略),对于某次比赛,对于某次比赛你可以选择一种方案作为本次比赛的评分方案
策略模式结构:1、策略;2、上下文;3、具体策略
package face;//裁判给运动员打分
import java.util.Arrays;
interface Strategy{//打分策略,用接口来定义
public double computerAverage(double []a);
}
class AverageScore{ //上下文面向策略,即面向接口(抽象类)的类
Strategy strategy;
public void setStrategy(Strategy strategy){
this.strategy = strategy;
}
public double getAverage(double []a){
if(strategy != null){
return strategy.computerAverage(a);
}else{
System.out.println("没有求平均值的算法符合要求");
return -1;
}
}
}
class StrategyA implements Strategy{ //直接得到所有分数平均数的打分(策略A)
@Override
public double computerAverage(double[] a) {
double sore=0 ,sum =0;
for(int i=0; i<a.length; i++){
sum += a[i];
}
return sum/(a.length);
}
}
class StrategyB implements Strategy{ //去掉一个最高分与去电一个最低分的打分(策略B)
@Override
public double computerAverage(double[] a) {
if(a.length<=2)
return 0;
double score =0, sum =0;
Arrays.sort(a);
for(int i=1; i<a.length-1; i++){
sum += a[i];
}
return sum/(a.length-2);
}
}
class Person{ //运动员选手
private String name;
private double score;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
}
public class Demo04 {
public static void main(String[] args) {
AverageScore game = new AverageScore(); //等到上下文对象实例game
game.setStrategy(new StrategyA()); //上下文对象使用策略A
Person zhang = new Person();
zhang.setName("张三");
double []a ={9.12, 9.25, 8.87, 9.99, 6.99, 7.88 };
zhang.setScore(game.getAverage(a)); //上下文对象通过策略A得到平均值,并把平均值的分打给一个叫做张三的运动员
System.out.println("平均得分(算法A):");
System.out.printf("%s最后得分:%5.3f%n",zhang.getName(),zhang.getScore());
game.setStrategy(new StrategyB()); //上下文对象使用策略B
zhang.setScore(game.getAverage(a)); //上下文对象通过策略B得到平均值,并把平均值的分打给一个叫做张三的运动员
System.out.println("去掉一个最高分,去掉一个最低分平均得分(算法B):");
System.out.printf("%s最后得分:%5.3f%n",zhang.getName(),zhang.getScore());
}
}