zoukankan      html  css  js  c++  java
  • 设计模式(四)——策略模式

    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 }

  • 相关阅读:
     sublime text3快速生成html头部信息(转)
    电脑同时安装Python2和Python3以及virtualenvwrapper(转)
    在windows下使用多版本Python安装相应的虚拟开发环境
    win10+wget 收藏
    关于OS_PRIO_SELF的说明
    select菜单实现二级联动
    HeadFirst设计模式笔记:(六)命令模式 —— 封装调用
    rnqoj-57-找啊找啊找GF-二维背包
    UILable:显示多种颜色的方法
    动态规划晋级——POJ 3254 Corn Fields【状压DP】
  • 原文地址:https://www.cnblogs.com/cxy2016/p/7569773.html
Copyright © 2011-2022 走看看