作用与场景
- 避免代码臃肿难以阅读,如非常多的if..else,参照单一原则,使每种事情得以抽象出来,代码结构更加清晰(曾经参加面试时,有面试官问,如果if..else过多怎么解决,当时一脸懵逼);
- 常用于负载均衡策略的选择、商品税率、商品活动等场景,在很多开源中间件中也都有策略模式的影子(多看源码有好处);
策略模式的几个角色:
- 策略接口Strategy
- 具体策略对象xxxxStrategy
- 执行策略对象invoker,内部持有一个策略类的引用
- 客户端对象Client
策略模式关系图
举例:
负载均衡策略的选择,包括随机、轮询、权重等
策略接口Strategy
1 | public class Strategy{ |
具体策略对象xxxxStrategy
1 | /** |
1 | /** |
执行策略对象invoker
1 | public class ServerDiscovery{ |
客户端对象Client
1 | public class Client{ |
总结:
这里只是抛砖引玉,更好的实现见spring cloud中的Ribbon负载均衡策略;
优点:
- 避免代码臃肿难以阅读,如非常多的if..else,参照单一原则,使每种事情得以抽象出来,代码结构更加清晰;
缺点:
- 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。
- 由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很多(说缺点有些牵强,能多出来多少呢!);
设计模式系列文章: