2020年9月6日16:39:34
自古深情留不住,唯有套路得人心。
Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it。
定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化。——《设计模式:可复用面向对象软件的基础》
策略模式结构图:
策略模式有三个角色,分别是:
声明:以下故事纯属虚构,不代表我自己的观点,无歧视任何人。
这个故事要从渣男说起。有天在看新闻时,看到《渣男同时交17个女友:看人家这秘籍!》,我母胎单身,推荐精准啊,匆忙点击进去看到了渣男的秘籍。过了一会我就退出了,我深知自己做不到这样子,谎话连篇,都是套路。今天写策略模式时,忽然想到了这个。
渣男有一个葵花宝典,面对不同的女性,使用不同的套路,只为得到女人的心。面对拜金女,显示自己的有钱,买金卖银。面对爱才女,写诗写词。
代码示例类图:
抽象策略角色(TaoLu.java):
// 套路
public interface TaoLu {
void taoLu();
}
具体策略角色(RichTaoLu.java、TalentedTaoLu.java):
// 有钱人套路
public class RichTaoLu implements TaoLu {
@Override
public void taoLu() {
System.out.println("为她买金");
System.out.println("为她买银");
System.out.println("为她买包包");
}
}
// 有才套路
public class TalentedTaoLu implements TaoLu {
@Override
public void taoLu() {
System.out.println("为她写诗");
System.out.println("为她弹琴写词");
System.out.println("为她摘星星月亮");
}
}
上下文角色(KuiHuaBaoDian.java):
// 葵花宝典
public class KuiHuaBaoDian {
// 持有套路(Strategy)的引用
private TaoLu taoLu;
public KuiHuaBaoDian(TaoLu taoLu) {
this.taoLu = taoLu;
}
public void toGetTheGirlIntoBed(String girl) {
taoLu.taoLu();
System.out.println("你得到了" + girl + "的心");
}
}
测试类(ZhaNan.java):
// 渣男
public class ZhaNan {
public static void main(String[] args) {
KuiHuaBaoDian kuiHuaBaoDian;
String girl1 = "拜金女";
// 选择策略
TaoLu taoLu1 = new RichTaoLu();
// 创建上下文
kuiHuaBaoDian = new KuiHuaBaoDian(taoLu1);
kuiHuaBaoDian.toGetTheGirlIntoBed(girl1);
String girl2 = "爱才女";
// 选择策略
TaoLu taoLu2 = new TalentedTaoLu();
// 创建上下文
kuiHuaBaoDian = new KuiHuaBaoDian(taoLu2);
kuiHuaBaoDian.toGetTheGirlIntoBed(girl2);
}
}
测试结果如下:
策略模式使用场景有:
在strategy pattern文章中提到:
There is a lot of debate around the use of the Strategy Pattern with Spring. Often you’ll see the Strategy Pattern used in conjunction with Dependency Injection, where Springs IoC container is making the choice of which strategy to use. Different data sources as a great example. Using a H2 data source for local development is one strategy. Using MySQL for production is another strategy. Which one is to use at runtime is up to the Spring IoC container.
在Spring中的策略模式:
策略模式封装算法,提供给上下文选择使用,客户端无需关心算法具体逻辑,无需关系关系算法更替,但是使用前需要知道具体策略类。
2020年9月6日21:04:51