1.什么是策略模式
策略模式 (Strategy Pattern)又称政策模式,其定义一系列的算法,把它们一个个封装起来,并且使它们可以互相替换。
封装的策略算法一般是独立的,策略模式根据输入来调整采用哪个算法。关键是策略的实现和使用分离。
2.如何理解策略模式
可以设想一下 , 一个万能遥控器 , 可以调节红外频率和波长 , 来适配对应的电器
- 遥控器的红外频率和波长 与 电器 之间相互独立,但又可以相互替换;
- 遥控器的红外频率和波长 与 电器(封装上下文)之间可以根据需要的不同选用不同的策略;
3.如何运用策略模式
小demo:
//策略模式demo const celue = (function(){ //使用闭包隐藏算法 //算法部分提取出来保存为一个对象 var obj = { funA(n) { return n + 'a' }, funB(n) { return n + 'b' }, funC(n) { return n + 'c' } } //入口 return { diao:function(fun,n){ //执行 return obj[fun] && obj[fun](n); }, addfun(fun,fn){ // 预留了增加策略的入口,便于扩展 if (obj[fun]) return; obj[fun] = fn } } })() celue.diao('funB',132) //通过对象的键值索引调用具体的算法 console.log(celue.diao('funB',132)) //b132 celue.addfun('funD',function(n){ //注册新计算方式 return n+'d' }) console.log(celue.diao('funD',123456)) //d123456
4.策略模式的优缺点
优点:
- 策略之间相互独立,但策略可以自由切换,这个策略模式的特点给策略模式带来很多灵活性,也提高了策略的复用率;
- 可扩展性好,策略可以很方便的进行扩展;
- 如果不采用策略模式,那么在选策略时一般会采用多重的条件判断,采用策略模式可以避免多重条件判断,增加可维护性;
缺点:
- 策略相互独立,因此一些复杂的算法逻辑无法共享,造成一些资源浪费;
- 如果用户想采用什么策略,必须了解策略的实现,因此所有策略都需向外暴露,这是违背迪米特法则/最少知识原则的,也增加了用户对策略对象的使用成本。
4.策略模式的使用场景
- 需要自由切换算法
- if 判断较多 , 需要规避多重判断