策略模式

參考: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());
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章