策略模式

  • Post author:
  • Post category:其他



一模式定义

策略模式:定义一系列的算法,将每一种算法封装起来并可以相互替换使用,策略模式让算法独立于使用它的客户应用而独立变化。


二模式举例


1模式分析

我们借用商场促销商品来说明这一模式。




2策略模式静态类图




3代码示例

3.1 创建策略接口一IStrategy

Java代码

收藏代码



  1. package

    com.demo.strategy;



  2. /**



  3. * 策略接口



  4. *



  5. * @author



  6. *



  7. */



  8. public


    interface

    IStrategy {


  9. /**



  10. * 计算实际价格方法



  11. *



  12. * @param consumePrice



  13. *            消费金额



  14. * @return



  15. */



  16. public


    double

    realPrice(

    double

    consumePrice);

  17. }

3.2 八折促销策略一RebateStrategy

Java代码

收藏代码



  1. package

    com.demo.strategy;



  2. /**



  3. * 打八折商品促销策略



  4. *



  5. * @author



  6. *



  7. */



  8. public


    class

    RebateStrategy

    implements

    IStrategy {


  9. private


    final


    double

    rate;



  10. /**



  11. * 构造方法设置打折率



  12. */



  13. public

    RebateStrategy() {


  14. this

    .rate =

    0.8

    ;

  15. }



  16. /**



  17. * 计算实际价格方法



  18. *



  19. * @param consumePrice



  20. *            消费金额



  21. * @return



  22. */



  23. public


    double

    realPrice(

    double

    consumePrice) {


  24. return

    consumePrice *

    this

    .rate;

  25. }


  26. }

3.3 满1000减200促销策略一ReduceStrategy

Java代码

收藏代码



  1. package

    com.demo.strategy;



  2. /**



  3. * 满1000减200 商品促销策略



  4. *



  5. * @author



  6. *



  7. */



  8. public


    class

    ReduceStrategy

    implements

    IStrategy {


  9. /**



  10. * 计算实际价格方法



  11. *



  12. * @param consumePrice



  13. *            消费金额



  14. * @return



  15. */



  16. public


    double

    realPrice(

    double

    consumePrice) {


  17. if

    (consumePrice >=

    1000

    ) {


  18. return

    consumePrice –

    200

    ;

  19. }

    else

    {


  20. return

    consumePrice;

  21. }

  22. }

  23. }

3.4 200以上部分打8折促销策略一PromotionalStrategy

Java代码

收藏代码



  1. package

    com.demo.strategy;



  2. /**



  3. * 满200,高于200部分打八折 商品促销策略



  4. *



  5. * @author



  6. *



  7. */



  8. public


    class

    PromotionalStrategy

    implements

    IStrategy {


  9. /**



  10. * 计算实际价格方法



  11. *



  12. * @param consumePrice



  13. *            消费金额



  14. * @return



  15. */



  16. public


    double

    realPrice(

    double

    consumePrice) {


  17. if

    (consumePrice >

    200

    ) {


  18. return


    200

    + (consumePrice –

    200

    ) *

    0.8

    ;

  19. }

    else

    {


  20. return

    consumePrice;

  21. }


  22. }

  23. }

3.5 创建上下文环境一Context

Java代码

收藏代码



  1. package

    com.demo.context;



  2. import

    java.math.BigDecimal;



  3. import

    com.demo.strategy.IStrategy;



  4. /**



  5. * 上下文环境



  6. *



  7. * @author



  8. *



  9. */



  10. public


    class

    Context {


  11. // 当前策略



  12. private

    IStrategy strategy;



  13. // 设置当前策略



  14. public


    void

    setStrategy(IStrategy strategy) {


  15. this

    .strategy = strategy;

  16. }



  17. // 使用策略计算价格



  18. public


    double

    cul(

    double

    consumePrice) {


  19. // 使用具体商品促销策略获得实际消费金额



  20. double

    realPrice =

    this

    .strategy.realPrice(consumePrice);


  21. // 格式化保留小数点后1位,即:精确到角


  22. BigDecimal bd =

    new

    BigDecimal(realPrice);

  23. bd = bd.setScale(

    1

    , BigDecimal.ROUND_DOWN);


  24. return

    bd.doubleValue();

  25. }

  26. }

3.6 消费者购物消费一Client

Java代码

收藏代码



  1. package

    com.demo;



  2. import

    java.util.Random;



  3. /**



  4. * 客户端应用程序



  5. *



  6. * @author



  7. *



  8. */



  9. public


    class

    Client {



  10. /**



  11. * @param args



  12. */



  13. public


    static


    void

    main(String[] args) {


  14. // 创建上下问环境对象实例



  15. // Context context = new Context();



  16. // 随机数对象


  17. Random random =

    new

    Random();


  18. for

    (

    int

    i =

    0

    ; i <

    10

    ; i++) {


  19. // 产生随机数的方式判断使用何种促销策略



  20. int

    x = random.nextInt(

    3

    );


  21. // 消费价格也是由随机数产生的(不能为0)



  22. double

    consumePrice =

    0

    ;


  23. while

    ((consumePrice = random.nextInt(

    2000

    )) ==

    0

    ) {

  24. }



  25. double

    realPrice = consumePrice;


  26. switch

    (x) {


  27. case


    0

    :


  28. // 打八折商品



  29. // context.setStrategy(new RebateStrategy());


  30. realPrice = consumePrice *

    0.8

    ;


  31. break

    ;


  32. case


    1

    :


  33. // 满200,高于200部分打八折 商品



  34. // context.setStrategy(new PromotionalStrategy());



  35. if

    (consumePrice >

    200

    ) {

  36. realPrice =

    200

    + (consumePrice –

    200

    ) *

    0.8

    ;

  37. }


  38. break

    ;


  39. case


    2

    :


  40. // 满1000减200 商品



  41. // context.setStrategy(new ReduceStrategy());



  42. if

    (consumePrice >=

    1000

    ) {

  43. realPrice = consumePrice –

    200

    ;

  44. }


  45. break

    ;

  46. }

  47. System.out.print(

    “【”


  48. + (x ==

    0

    ?

    “打八折”

    : (x ==

    1

    ?

    “高于200部分打八折”


  49. : (x ==

    2

    ?

    “满1000减200”

    :

    “”

    ))) +

    “】商品:”

    );


  50. System.out.println(

    “原价:”

    + consumePrice +

    ” – 优惠后价格:”

    + realPrice);

  51. }

  52. }

  53. }


4运行结果


【满1000减200】商品:原价:908.0 – 优惠后价格:908.0


【满1000减200】商品:原价:1129.0 – 优惠后价格:929.0


【满1000减200】商品:原价:829.0 – 优惠后价格:829.0


【打八折】商品:原价:518.0 – 优惠后价格:414.40000000000003


【满1000减200】商品:原价:1230.0 – 优惠后价格:1030.0


【打八折】商品:原价:106.0 – 优惠后价格:84.80000000000001


【满1000减200】商品:原价:1134.0 – 优惠后价格:934.0


【高于200部分打八折】商品:原价:664.0 – 优惠后价格:571.2


【满1000减200】商品:原价:564.0 – 优惠后价格:564.0


【满1000减200】商品:原价:730.0 – 优惠后价格:730.0


三该模式设计原则

1″开-闭”原则

2单一职责原则


四使用场合

1当多个类的表现行为不同,需要在运行时刻动态选择具体执行的行为的时候。

2需要在不同情况下使用不同策略,或者策略还可能在未来用其它方式实现的时候。

3需要隐藏具体策略的实现细节,各个具体策略彼此独立的时候。

4当一个类中出现了多种行为,而且在一个操作中使用多个条件分支来判断使用多种行为的时候,可以使用策略模式将各个条件分支的动作植入具体策略中实现。


五策略模式静态类图





版权声明:本文为wzhw2008原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。