參考:https://www.cnblogs.com/dotgua/p/strategy-pattern.html
https://www.cnblogs.com/java-my-life/archive/2012/05/10/2491891.html
策略模式的結構中包含3種角色:策略(Strategy)、上下文(Context)、具體策略(ConcreteStrategy)
策略接口:
public interface Strategy {
public double computerAverage(double a[]);
}
實現策略接口的具體策略A:
public class ConcreteStrategyA implements Strategy{
@Override
public double computerAverage(double a[]) {
double sum = 0, score = 0;
for (int i = 0; i < a.length; i++) {
sum += a[i];
}
score = sum / a.length;
return score;
}
}
實現策略接口的具體策略B:
public class ConcreteStrategyB implements Strategy{
@Override
public double computerAverage(double a[]) {
if (a.length <= 2)
return 0;
double sum = 0, score = 0;
for (int i = 1; i < a.length-1; i++) {
sum += a[i];
}
score = sum / (a.length - 2);
return score;
}
}
人:
class Person {
String name;
double score;
public void setScore(double t) {
score = t;
}
public void setName(String s) {
name = s;
}
public double getScore() {
return score;
}
public String getName() {
return name;
}
}
選擇策略:
public 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("沒有求平均值的方法,得到的-1不代表平均值");
return -1;
}
}
}
Main主類:
public class Main {
public static void main(String[] args) {
AverageScore game = new AverageScore();
game.setStrategy(new ConcreteStrategyA());
Person wang = new Person();
wang.setName("王建");
double [] a = {9.1, 9.2, 9.3, 9.4, 9.5, 9.6, 9.7, 9.0};
double aver = game.getAverage(a);
wang.setScore(aver);
System.out.println("算法A:");
System.out.printf("%s的最後得分是%5.3f%n", wang.getName(), wang.getScore());
game.setStrategy(new ConcreteStrategyB());
aver = game.getAverage(a);
wang.setScore(aver);
System.out.println("算法B:");
System.out.printf("%s的最後得分是%5.3f", wang.getName(), wang.getScore());
}
}