设计模式(四)——策略模式

1.描述

定义一系列算法,把他们一个个封装起来,并且使他们可以交互替换。本模式可以使算法独立于使用它的用户而变化。

2.优点

·上下文(Context)和具体策略(ConcreteStrategy)是松耦合关系。

·策略模式满足“开闭原则”。

3.用途

·一个类定义了多种行为,并且这些行为在这个方法中以多个条件形式的语句出现,可以使用策略模式避免在类中大量使用条件语句。

·程序不希望暴露复杂的、与算法相关的数据结构。

·使用一个方法的不同变体。(要和重载区分)

4.模式使用

·策略(Strategy):策略是一个接口,该接口定义若干个算法标识,即定义了若干个抽象方法。

·具体策略(ConcreteStrategy):具体策略是实现策略接口的类。具体策略实现策略接口所定义的抽象方法,即给出算法标识的具体算法。

·上下文(Context):上下文是依赖于策略接口的类,即上下文包含有策略声明的变量。上下文中提供一个方法,该方法委托策略变量调用具体策略所实现的策略接口中的具体方法。

5.UML图

 

6.案例

Game类中有一个计算平均分的方法getScore(double[] a),对于Game类的对象,有些要求getScore(double[] a)方法计算算数平均值,有些要求getScore(double[] a)方法计算几何平均值。(显然不能使用重载)

 1 package 策略模式;
 2 
 3 public class test1 {
 4     public static void main(String[] args) {
 5         double[] a = new double[10];
 6         for(int i = 0; i < 10; i++)
 7             a[i] = Math.random() * 100;
 8         Game game = new Game(new Strategy1()); //策略1 算术平均值
 9         System.out.println("策略1 算术平均值" + game.getScore(a));
10         game = new Game(new Strategy2()); //策略2 几何平均值
11         System.out.println("策略2 几何平均值" + game.getScore(a));
12     }
13 
14 }
15 
16 /*
17  * 策略
18  */
19 interface ComputableStrategy{
20     public abstract double ComputeScore(double[] a);
21 }
22 
23 /*
24  * 具体策略  计算算数平均值
25  */
26 class Strategy1 implements ComputableStrategy{
27 
28     public double ComputeScore(double[] a) {
29         double score = 0 , sum = 0;
30         for(int i = 0; i < a.length; i++)
31             sum = sum + a[i];
32         score = sum/a.length;
33         return score;
34     }
35     
36 }
37 
38 /*
39  * 具体策略  计算几何平均值
40  */
41 class Strategy2 implements ComputableStrategy{
42 
43     public double ComputeScore(double[] a) {
44         double score = 0 , multi = 1;
45         for(int i = 0; i < a.length; i++)
46             multi = multi * a[i];
47         score = Math.pow(multi, 1.0/a.length);
48         return score;
49     }
50     
51 }
52 
53 /*
54  * 上下文
55  */
56 class Game{
57     ComputableStrategy strategy;
58     public Game(ComputableStrategy strategy){
59         this.strategy = strategy;
60     }
61     public double getScore(double[] a){
62         if(strategy != null)
63             return strategy.ComputeScore(a);
64         else
65             return 0;
66     }
67 }

 

posted @ 2017-09-21 17:34  海森堡不如我侧的准  阅读(159)  评论(0编辑  收藏  举报