1.定义抽象接口和方法
/**
* @Author: king
* @Date: 2019/12/23 14:54
* @Version 1.0
* 策略抽象接口
* 计算得分
*/
public interface IStrategy {
public abstract double computeScore(double[] score);
}
2.具体策略(接口实现)
1)策略1
/**
* @Author: king
* @Date: 2019/12/23 15:15
* @Version 1.0
* 平均分
*/
public class StrategyOne implements IStrategy {
public double computeScore(double[] score) {
double s = 0, sum = 0;
for (int i = 0; i < score.length; i++) {
sum += score[i];
}
s = sum / score.length;
return s;
}
}
2)策略2
import java.util.Arrays;
/**
* @Author: king
* @Date: 2019/12/23 15:18
* @Version 1.0
* 去除最高最低分后平均值
*/
public class StrategyTwo implements IStrategy {
public double computeScore(double[] score) {
if (score.length < 3) {
return 0;
}
Arrays.sort(score);
double s = 0, sum = 0;
for (int i = 1; i < score.length - 1; i++) {
sum += score[i];
}
s = sum / (score.length - 2);
return s;
}
}
3.封装
/**
* @Author: king
* @Date: 2019/12/23 14:43
* @Version 1.0
* 策略模式
* a) 提供公共接口或抽象类,定义需要使用的策略方法。(策略抽象类)
* b) 多个实现的策略抽象类的实现类。(策略实现类)
* c) 环境类,对多个实现类的封装,提供接口类型的成员量,可以在客户端中切换。
* d) 客户端 调用环境类 进行不同策略的切换。
*/
public class Strategy {
private static Strategy s;
private Strategy(){
}
IStrategy strategy;
public static synchronized Strategy getInstance(){
if (s==null){
s = new Strategy();
}
return s;
}
public void setStrategy(IStrategy strategy) {
this.strategy = strategy;
}
public double getPersonScore(double[] score) {
if (strategy != null) {
return strategy.computeScore(score);
}
else {
return 0;
}
}
}
4.调用
/**
* @Author: king
* @Date: 2019/12/23 15:46
* @Version 1.0
*/
public class Test {
public Test() {
}
public static void main(String[] args) {
double[] score = {1, 2, 3, 4, 5, 6};
Strategy strategy = Strategy.getInstance();
IStrategy s = new StrategyOne();
strategy.setStrategy(s);
double d = strategy.getPersonScore(score);
System.out.println(d);
}
}