策略模式
介绍
策略模式(Strategy Pattern):该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。最主要的特点是一个类的行为或其算法可以在运行时更改。
类图
类图说明:
- 策略(PayMethod):策略是一个接口,该接口定义算法标识。
- 具体策略(
WeChatPay
、AliPay
、AliPay
):具体策略是实现策略接口的类。具体策略实现策略接口所定义的抽象方法,即给出算法标识的具体算法。 - 环境类(
Pay
):持有一个策略类的引用,最终给客户端调用。
我们用支付来演示一下策略模式,PayMethod
为支付方式接口,定义了支付方式,WeChatPay
为微信支付,实现了PayMethod
接口,AliPay
为支付宝支付,实现了PayMethod
接口,BankCardPay
为银行卡支付,也实现了PayMethod
接口。三种不同的类都实现了同一个接口,只是内部实现不一样。Pay
为支付接口,定
义了支付功能,Pay
组合了PayMethod
接口,这样就可以再使用支付时可以使用不同的支付方式进行支付,下面看代码实例:
代码分析
PayMethod
接口
1 | public interface PayMethod { |
WeChatPay
类,实现了PayMethod
接口
1 | public class WeChatPay implements PayMethod { |
AliPay
类,实现了PayMethod
接口
1 | public class AliPay implements PayMethod { |
BankCardPay
类,实现了PayMethod
接口
1 | public class BankCardPay implements PayMethod { |
Pay
类
1 | public class Pay { |
测试截图
优点
- 策略模式提供了对“开闭原则”的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为。
- 策略模式提供了管理相关的算法族的办法。
- 策略模式提供了可以替换继承关系的办法。
- 使用策略模式可以避免使用多重条件转移语句。
缺点
- 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
- 策略模式将造成产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 故友的学习录!
评论