策略模式-Strategy Pattern

408 阅读1分钟

解决问题

将算法按照策略或场景封装起来,以方便按照不同的场景执行不同的策略。它很好的解决了通过if...else 来决策行为而带来的代码和逻辑复杂性。

应用场景

一个经常被拿来举例的场景是收银员收银场景:它需要根据不同的场景(是否为会员、有无促销等)来决定计算方式,如果使用if..else将使得代码复杂的无法维护,这时我们就可以分场景来计算即可。

所以该策略的应用场景即为:需要根据场景执行不同的策略(该策略应该具有一定的复杂性)

模式图UML

  • Context:即场景,持有一个或多个策略

  • Strategy: 即策略,具有一个执行策略的方法

  • ConcreteStrategy:具体策略

示例

举一个实际工作中的例子吧。APP在改版时通常需要做ABTest,A/B策略展式的样式会有所不同。

  • Strategy
public interface Strategy { 
    public void show(); 
} 
  • Concrete
public class StrategyA implements Strategy { 
    @Override 
    public void show() { 
        System.out.println("展示促销"); 
    } 
}
public class StrategyB implements Strategy{ 
    @Override 
    public void show() { 
        System.out.println("展示广告"); 
    } 
}
  • Context
@AllArgsConstructor 
public class Context { 
    private Strategy strategy; 
    // 可能还有其它信息 
     
    public void showPattern() { 
        strategy.show(); 
    } 
}
  • client
public class Client { 
    public static void main(String[] args) { 
        String a = "a";// getStrategy from rpc 
        Strategy strategy; 
        if (a.equals("a")) { 
            strategy = new StrategyA(); 
        } else { 
            strategy = new StrategyB(); 
        } 
 
        new Context(strategy).showPattern(); 
    } 
}

参考

https://en.wikipedia.org/wiki/Strategy_pattern