开局还是那种图,最近策略模式貌似很火,各位客官往下看…
策略模式到底是什么?
前面我们其实已经将结构型模式讲解完了,剩下的全都是行为型模式,三种模式的区分:
- 创建型模式:如何创建一个对象
- 结构型模式:对象内部的构造是如何构造的
- 行为型模式:对象是如何运行(可以做什么)
而提到策略模式,我们该如何理解呢?
-
从北京到上海,可以坐飞机,也可以坐动车,也可以坐绿皮,甚至可以骑自行车,这些不同的方式,就是策略。
-
一件商品,可以直接打 5 折,也可以加 100 再打 6 折,也可以打 5.5 折之后返回现金券,这些也是策略。
-
带了 200 去超市买东西,可以买零食,也可以买生活用品,也可以啥也不买,这些也是策略。
上面的例子,其实我们可以发现不同的策略其实是可以互换的,甚至策略细节之间可以混搭,那么很多时候我们为了方便拓展,方便替换策略,对调用方屏蔽不同的策略细节,就可以使用策略模式。倘若所有的策略全部写在一个类里面,可以是可以,这样维护代码会越来越复杂,维护只会越来越困难,里面会充斥着各种if-else
,算法如果日益复杂,动一发而牵全身,那就只剩下提桶跑路了。
策略模式是指有一定行动内容的相对稳定的策略名称。策略模式在古代中又称“计策”,简称“计”,如《汉书·高帝纪上》:“汉王从其计”。这里的“计”指的就是计谋、策略。策略模式具有相对稳定的形式,如“避实就虚”、“出奇制胜”等。一定的策略模式,既可应用于战略决策,也可应用于战术决策;既可实施于大系统的全局性行动,也可实施于大系统的局部性行动。
再说一个打工人都知道的例子,比如每个人都要交个人所得税,我们知道个人所得税的计算方式是很复杂的,税法计算就是一个行为,而可能存在不同实现算法,那每一种计算算法都是一种策略。
这些策略可能随时被替换掉,那么我们为了好替换,相互隔离,就定义一系列算法,封装起来,这就叫策略模式。
策略模式的角色
策略模式一般有三种角色:
- 抽象的策略类(
Strategy
):将策略的行为抽象出公共接口 - 具体的策略类(
ConcreteStrategy
):以Strategy
接口实现某些具体的算法,具体的策略可能多个,也可以相互替换 - 上下文(
Context
): 一般是封装了策略,以及策略的使用方法,对上层调用屏蔽了细节,直接调用即可。
策略模式的demo
创建一个抽象的策略接口:
public interface Strategy {
int doStrategy();
}
创建 2 个具体的策略类,分别执行策略:
public class ConcreteStrategy1 implements Strategy{
@Override
public int d