今天,我们来分享行为型模式的另外一个成员:策略模式。
策略模式是一种行为型模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,使得算法可以独立于使用它们的客户端变化而变化。策略模式使得算法的变化可以独立于使用算法的客户端。
在开始本文之前,我们先来看下生活中的的一些场景:
场景1:出行
比如出行,可以采用公共汽车出行,可以打的出行,可以自驾出行,也可以骑自行车出行等等。我们可以根据天气、距离、时间紧迫等因素决定采用哪一种方式出行。
场景2:购物车支付
比如购物支付,可以采用信用卡、银联、支付宝、微信等方式支付,每种都有各自的算法和行为。
再如采用不同策略完成计费、完成排序等都是在多个现实应用可以找到的。在这些场景中,将算法封装在对象中,这样可以方便地指定和改变一个对象所使用的算法。这个就是我们要聊的策略模式要做的事情。
意图
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。策略模式使得算法可独立于使用它的客户而变化。
结构
策略模式的基本结构如下:
Strategy (策略)
定义所有支持的算法的公共接口,通常由一个接口或抽象类实现。
ConcreteStrategy (具体策略)
以Strategy接口实现某具体算法。
Context (上下文)
持有一个对Strategy对象的引用
本文给出一个发短信的示例,平台需要根据不同的省份和场景,通过不同的网关发送短信。
发送短信的方式有如下几种方式:
接下来,根据策略模式的结构完成一个简单的示例:
MessageStrategy (Strategy)
三个具体策略(ConcreteStrategy)
MessageContext (Context)
模拟一下根据不同策略来完成简单的短信发送
输出结果
这样,一个使用策略完成不同通道发送短信的示例就完成了。
同样,如果使用不同策略(比如冒泡、快速排序以及归并排序等)完成排序,或者使用不同的本地缓存实现缓存的存和取(比如,ConcurrentHashMap和Guava LocalCache ... ..)
一个排序策略的例子
策略接口和具体策略
策略上下文
客户端Client
运行结果
策略模式上下文的作用
上下文在策略模式中的作用是将客户端与具体策略解耦,上下文通常包含一个对策略接口的引用,这使得它可以调用任何实现该接口的具体策略。上下文还包含一个方法来设置当前要使用的具体策略,这使得客户端可以根据需要轻松地更改算法的行为。
适用场景
策略模式是一种行为模式,其是对算法的封装,是把使用算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一些系列的策略类里面,作为一个抽象策略的子类。本模式使得算法可独立于使用它的客户而变化。
在下面的情况下应当考虑使用策略模式:
状态模式 vs. 策略模式
状态模式
将一群行为封装到状态类中,主类的当前状态在状态集合中游走,随着时间的流逝,主类的行为不断变化,但这对客户端而言完全是透明的,而策略模式需要客户端明确所有策略,以指明一个具体的策略。
策略模式
定义一组 算法实现,实现之间可以任意替换,而且可以在运行时动态的选择任意一种实现。需要客户端清楚所有的策略以选择合适的策略。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。