什么是策略模式
策略模式图示:
这里选了《设计模式之禅》书中配图解释策略模式。该图示中有4个角色。 分别为:
- 使用者赵云表示外层业务
- 策略上下文类 成员变量有策略接口,bao露set策略接口的方法供使用者,以及一个或多个方法,这些方法中引用了策略接口的方法。
- 策略接口 封装了一个算法族(一类算法具有的共性)
- 具体策略(算法)算法的具体实现
策略模式的精髓在于
- 算法与使用者相互独立,避免了使用者对算法的直接访问,修改只需要改变使用者传入Context的接口实现
- 策略上下文对象可以只关注算法族共同的能力而不用在乎具体实现区别,用算法的能力实现更复杂的行为,或多个不同的行为。
以上一条画重点,这意味着我们可以在上下文类中用算法的能力实现更复杂的行为,或多个不同的行为,而不是在上下文中仅仅调用算法的方法。 策略上下文对象的意义在于:为一个算法族所有的算法提供了便捷的复用方式,即注入了就提供了上下文定义的各种行为。
优缺点
优点:
- 方便算法切换,方法的切换只需要使用者注入特定的算法即可
- 良好的应用了设计模式原则即变化与不变化相分离,变化的在上下文被封装为了接口,不变化的就在上下文中定义方法中写出,使得不变化的可以复用,只需运用JAVA的多态便捷的去实现不同的功能
缺点:
- 算法可能会很多,类数量增多
- 算法需对使用者暴露,即使用者需要明白每个算法的性质能不能满足需求,违背了设计原则,但这一点可以通过其他设计模式来弥补。
什么时候使用策略模式
- 需求中只有在算法上稍有不同的场景
- 算法变化可能性大的场景
- 需要屏蔽算法规则的场景-只需简单的注入对象就能够调用算法相关的方法
使用策略模式的思路
抽象出一个业务逻辑几个分支中共同的性质,定义为一个共同的能力,然后在上下文中用这个能力实现一个稍大的业务逻辑,于是实现就只需要注入特定的能力实现就行了
题外话
笔者也是最近才开始写博客,只是用于记录自己的学习心得,知识点诉说得不是很详细,如果有幸文章被大家看到,针对写的知识点上不明白的或者不对的可以发评论,我们一起交流