概念
策略模式:在不同的场景中,该行为有不同的实现算法。去不同的地方需乘坐不同的交通工具,从北京上班,坐地铁+骑车,去上海可以开车,高铁,去美国做飞机。
why
为什么用策略模式?
在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。
例子:
//定一个你想去的地方,然后就想着怎么到达目的地。
public interface whereyouwant {
void Howto();
}
//3个实现类
public class toCompany implements whereyouwant{
@Override
public void Howto() {
System.out.println("坐地铁上班");
}
}
public class toShanghai implements whereyouwant{
@Override
public void Howto() {
System.out.println("坐高铁去上海");
}
}
public class toUS implements whereyouwant{
@Override
public void Howto() {
System.out.println("做飞机去美国");
}
}
//策略包,想像下诸葛亮的锦囊
public class Content {
private whereyouwant want;
public Content(whereyouwant want) {
this.want = want;
}
public void excute(){
want.Howto();
}
public static void main(String[] args) {
Content c = null;
c= new Content(new toCompany());
c.excute();
c = new Content(new toShanghai());
c.excute();
c = new Content(new toUS());
c.excute();
}
}
思考下优缺点
优点:扩展性好,可以多切换。
缺点:策略类会增多。如果有很多的策略,比如100个策略,就不能这么写了,因为太多了,每增加一个策略,你的锦囊就得添加一下。
注意:如果系统的策略多余4个就考虑使用混合模式,解决策略类膨胀的问题。
拓展
策略模式在jdk中的应用
1、ThreadPoolExecutor中的四种拒绝策略
public void taskExecutor(){
ThreadPoolExecutor t = new ThreadPoolExecutor(10, 15, 200, null, null);
//直接抛出异常
t.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
//只用调用者所在线程来运行任务
t.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//丢弃队列里最近的一个任务,并执行当前任务
t.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardOldestPolicy());
//不处理,丢掉
t.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());
}
2、比较器Comparator
在Java的集合框架中,经常需要通过构造方法传入一个比较器Comparator,或者创建比较器传入Collections的静态方法中作为方法参数,进行比较排序等,使用的是策略模式。
在该比较架构中,Comparator就是一个抽象的策略;一个类实现该结构,并实现里面的compare方法,该类成为具体策略类;Collections类就是环境角色,他将集合的比较封装成静态方法对外提供api。
参考:菜鸟教程https://www.runoob.com/design-pattern/strategy-pattern.html
设计模式之--策略模式及其在JDK中的应用https://www.jianshu.com/p/8e59767067a8
ThreadPoolExecutor里面4种拒绝策略(详细)https://www.cnblogs.com/xiaoshahai/p/11619729.html
JDK设计模式之——策略模式(Comparable和Comparator接口) https://www.cnblogs.com/ssskkk/p/8784542.html
眼过千遍,不如手过5遍,成就=成功率*量级*做事速度,劝人向善,修心