一、定义
明天咱们探讨的设计模式是「策略模式」,策略模式比拟好了解,首先咱们看一下他的定义:
策略模式是一种定义一系列算法的办法,从概念上来看,所有这些算法实现的都是雷同的工作,只是实现不同,他能够以雷同的形式调用所有的算法,缩小了各种算法类与应用算法类之间的耦合「DEP」。
由下面的定义咱们能够看到,策略模式有 3 个因素:
- 策略模板:策略模式的算法都是为了实现雷同的工作的,只是可能触发条件不同,所以咱们就能够形象进去一个策略模板,相似于「工厂模式中的产品模板」;
- 策略:依据具体场景实现不同的策略,以依据理论场景失去具体的后果;
- 上下文:上下文依据场景不同来决定应用哪种策略。
二、举例说明
策略模式在生活中也比拟常见,上面举例说明:
当咱们在生活中乘坐公交地铁的时候,合肥市的票价是 2 元、学生半价、老年人免票,这就是一种常见的设计模式,咱们能够看出:
- 都是为了解决人们乘车计价的问题
- 不同年龄段的人计算价格办法不同
那咱们就有实现计划:
// 策略模板
class StrategyTemplate {constructor() {}}
// 老年人免票
class OldPersonStrategy extends StrategyTemplate {constructor() {}
calculatePrice() {return 0;}
}
// 学生半价
class StudentStrategy extends StrategyTemplate {constructor() {}
calculatePrice() {return 1;}
}
// 普票 2 元
class NormalStrategy extends StrategyTemplate {constructor() {}
calculatePrice() {return 2;}
}
// 上下文传入策略并应用
class BusContext {constructor(strategy) {this.strategy = strategy;}
pay() {return this.strategy.calculatePrice();
}
}
// 应用
const oldPerson = new BusContext(new OldPersonStrategy());
oldPerson.pay();
const student = new BusContext(new StudentStrategy());
student.pay();
const person = new BusContext(new NormalStrategy());
person.pay();
生存中咱们随处可见也有很多策略模式的应用,比方洗衣机(快洗、漂洗、大件等)、电饭煲(煮饭、煮粥等)、电动牙刷(高频、中频、低频)、购物(满减、打折、返利等)。
总结
由下面这么多的例子咱们能够总结进去,策略模式的应用场景有几个特点:
- 面对一个问题 / 需要有多种解决策略,须要判断不同的场景
- 场景的数量较少
长处就是:
- 策略与策略之间互相独立,扩展性、维护性比拟好
- 单元测试好做
- 缩小了
switch/if else
判断
毛病就是:
- 不适宜解决场景太多的状况
参考
大话设计模式 – 程杰
五分钟学设计模式.10. 策略模式
集体博客
北落师门的博客