看过HeadFirst设计模式的同学,应该印象比较深刻的本书第一个拿出来讲的就是策略模式,可以见得策略模式是比较适合入门的设计模式之一,那么今天我们就来详细说下设计模式之策略模式,通过这篇文章,我们可以了解到:
- 策略模式是什么和解决什么问题
- 策略模式使用场景和简单的Strategy 代码demo
- 策略模式的模板样例
目录:
一、策略模式概要
是什么:
策略模式(Strategy Pattern)属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口
的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。它的
uml图如下:
如上图所示,策略模式主要由三个角色组成,环境角色(Context)、抽象策略角色(Strategy)、具体策略角色(ConcreteStrategy)。
- 环境角色(Context):持有一个策略类的引用,提供给客户端使用。
- 抽象策略角色(Strategy):这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
- 具体策略角色(ConcreteStrategy):包装了相关的算法或行为。
二、策略模式使用场景和Demo
使用场景:
如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象
在许多行为中选择一种行为;一个系统需要动态地在几种算法中选择一种;如果一个对象有很多的行为,如果不用
恰当的模式,这些行为就只好使用多重的条件选择语句来实现;
demo
下面拿我在工作中使用到的策略模式来举例:
PaymentStrategyContainer为环境角色,用来提供给客户端用,这里面具体确定了具体的实现策略并分发给具体实现类。
PaymentStrategy为抽象策略接口,规范了具体策略实现类的行为。
WechatPaymentStrategyImpl和AlipayPaymentStrategyImpl分别表示了具体的算法,即业务上的微信支付还是支付宝支付。
以上三个类的代码因为涉及到公司业务这里就不便展示了;
具体的引用如下:我利用了枚举做策略容器的分发条件。
1 | //创建枚举 |
模板:
下面分享一下,通用设计的策略容器模板:
- Strategy:策略抽象接口,提供基础方法获得策略条件
- StrategyContainer:策略容器,用于生成策略实例。
- GenericExtractor:工具类,通用信息提取类
- StrategyContainerImpl:策略具体实现类,定义了具体策略的接入
1 | /** |
1 | /** |
1 | /** |
1 |
|