策略模式

概念

策略模式:在不同的场景中,该行为有不同的实现算法。去不同的地方需乘坐不同的交通工具,从北京上班,坐地铁+骑车,去上海可以开车,高铁,去美国做飞机。

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遍,成就=成功率*量级*做事速度,劝人向善,修心

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值