面试官:来吧,让我们聊聊JAVA的设计模式。
我OS:洒家背诵的设计23条终于派上了用场。
面试官:那你常用的是哪几种呢?开始你的表演吧。
我OS:???????这是让我死啊。
所以!!!拍黑板!!小葵花课堂开课啦!! 这节课让我们来了解一下策略模式
什么是策略模式
在了解策略模式之前,肯定是要去了解一下什么是策略模式的。
策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换。此模式让算法的变化独立于使用算法的客户。
策略模式的优缺点
优点:
- 算法可以*切换
- 改一下策略很方便
- 扩展性良好
- 增加一个策略,就多增加一个类就好了。
缺点:
- 策略类的数量增多
- 每一个策略都是一个类,复用的可能性很小、类数量增多
- 所有的策略类都需要对外暴露
- 上层模块必须知道有哪些策略,然后才能决定使用哪一个策略
了解完优缺点和简介之后,让我们开始用实例去具体了解一下吧。
JDK中的例子
JDK和第三方包中其实大量用到了策略模式,像小葵花课堂讲师猿某在之前了解线程池源码的时候就看到了一个例子。
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
}
如果对于线程池不了解的话,可以看下阿猿的线程池源码讲解。线程池中的缓存队列和拒绝策略其实都用到了策略模式。
那我们已workQueue作为例子来讲解一下吧。
线程池的worlQueue其实都是BlockingQueue的实现类,在使用的时候就可以自己实现或者指定已有的实现类。这里就满足了策略模式的优点,算法*切换、扩展性好。
demo
相信举了线程池的例子大部分胖友们应该都了解了。那么我们再来举一个例子加深印象,也可以给胖友们的面试多一些逼逼赖赖的素材。
相信大家的公司都会有支付业务,而目前最常用的支付手段有微信,支付宝,云闪付等。
所以!!我们需要用到策略模式给支付业务添一点色彩。
public interface PayService {
public void pay();
}
微信支付
public class WxPayService implements PayService {
@Override
public void pay() {
//微信付款
}
}
支付宝支付
public class AliPayService implements PayService {
@Override
public void pay() {
//支付宝付款
}
}
总方法
public class Order {
private PayService payService;
public Order (PayService payService) {
this.payService = payService;
}
public void exec() {
payService.pay();
}
}
public void static main(String[] args){
Order wxOrder = new Order(new WxPayService());
wxOrder.pay();
Order aliOrder = new Order(new AliPayService());
aliOrder.pay();
}
如上的代码应该胖友们一看就明白了吧。实际中可以有更好的解决方案。希望这篇文档能帮助到旁友们在面试中问到设计模式的时候,能够让大家多逼逼赖赖几句