strategy模式

    场景 :

    • 我们可以根据不同的参数来选择一种我们想要执行的优惠计价方式;

    策略模式,将会成为最最高频使用的一种设计模式,他的常见应用场景,就是替换掉那一大坨复杂难懂的if else if else。对于那种过于复杂的选择判断逻辑,完全可以将选择哪种策略的过程放到工厂里去。工厂,可以是简单工厂,也可以是工厂方法,也可以是抽象工厂。

    我们这里打算用抽象工厂模式,跟策略模式结合起来,大家可以想象一下复杂的场景,一个复杂的业务逻辑里面,每个if else判断之后,要跟一堆复杂的业务逻辑,我们可以将不同的业务逻辑抽取成不同的策略,然后一个具体的工厂实现,可以创建出一个策略组合来。

    策略模式跟命令模式的区别?
    看起来一样的,但是用处不一样。命令是可以发送出去,然后可以经过一些队列的流转,比如先把命令发送到MQ,接着再处理。策略是说选择了一组策略,立即就要执行的,不会经过其他别的什么处理。而且策略逻辑基本就是用在复杂的if else代码中的;

    命令模式,可以用在更多别的场景中;

    1. package com.example.designpattern.strategy;
    2. public class StrategyPatternDemo {
    3. public static void main(String[] args) {
    4. int discountStyle = 1;
    5. DiscountCalculateStrategy strategy = DiscountCalculateStrategyFactory
    6. .getDiscountCalculateStrategy(discountStyle);
    7. Context context = new Context();
    8. context.setStrategy(strategy);
    9. context.calculate();
    10. // 要点1:必须将if else的代码,封装到不同的策略类中
    11. // 要点2:将选择哪种策略的逻辑给放到一个工厂类中去,选择策略的代码务必很简洁
    12. // 要点3:context可有可无,具体是看你的策略执行这块如果就一行代码调用,不需要context
    13. // 如果context中的策略执行逻辑较为复杂一点,context来封装策略类的执行逻辑
    14. }
    15. public interface DiscountCalculateStrategy {
    16. void calculate();
    17. }
    18. public static class DiscountCalculateStrategyA implements DiscountCalculateStrategy {
    19. public void calculate() {
    20. System.out.println("执行优惠计价方式1的复杂业务逻辑");
    21. }
    22. }
    23. public static class DiscountCalculateStrategyB implements DiscountCalculateStrategy {
    24. public void calculate() {
    25. System.out.println("执行优惠计价方式2的复杂业务逻辑");
    26. }
    27. }
    28. public static class DiscountCalculateStrategyDefault implements DiscountCalculateStrategy {
    29. public void calculate() {
    30. System.out.println("执行默认的优惠计价方式的复杂业务逻辑");
    31. }
    32. }
    33. public static class DiscountCalculateStrategyFactory{
    34. public static DiscountCalculateStrategy getDiscountCalculateStrategy(int discountStyle) {
    35. if(discountStyle == 1) {
    36. return new DiscountCalculateStrategyA();
    37. } else if(discountStyle == 2) {
    38. return new DiscountCalculateStrategyB();
    39. } else {
    40. return new DiscountCalculateStrategyDefault();
    41. }
    42. }
    43. }
    44. public static class Context {
    45. private DiscountCalculateStrategy strategy;
    46. public DiscountCalculateStrategy getStrategy(){
    47. return strategy;
    48. }
    49. public void setStrategy(DiscountCalculateStrategy strategy){
    50. this.strategy = strategy;
    51. }
    52. public void calculate(){
    53. strategy.calculate();
    54. }
    55. }
    56. }