一句话总结
我有选择恐惧症 你别让我一个一个挑 我给你说需求 你帮我挑好
选择恐惧症
- 选择恐惧症
选择恐惧症 说明了能选择的不止一个 (对应的策略不止一个)
每一个策略对应一个类
- 我给你说需求
这个地方我刚开始也不理解 刚开始学习的时候就知道需要那个策略直接NEW 就行了
我怎么知道该New 那一个 难道要if else 判断 如果是这样 那还用啥策略模式?
这个时候你会想到 就算 判断 是不是有个判断的依据 如 下图 这里的paymentType
不就是我要的需求吗 ?
我给你个paymentType 你给我个类不就行了
if ("支付宝".equals(paymentType)) {
} else if ("微信".equals(paymentType)) {
}
- 你帮我挑好
这里的你 该如何定义类?
上文提到的一对一的关系是不是想到了 map (还有人用枚举类)
如果你是spring的项目 也可以用applicationContext 获取不同的bean对象(下面会有案例)
这样一分析是不是策略模式的主要角色都出来了。
抽象策略(Strategy)类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。
具体策略(Concrete Strategy)类:(上文中的具体的选择)实现了抽象策略定义的接口,提供具体的算法实现。
环境(Context)类:(上文中的你)持有一个策略类的引用,最终给客户端调用。
类图
细心的小伙伴会发现 这和状态模式类图很像如下图
这不是像简直一摸一样 这里先不讨论他俩的区别 详细的看https://www.runoob.com/w3cnote/state-vs-strategy.html
策略模式之皇上选妃
抽象策略(Strategy)类
/**
* 抽象妃子类
*/
public interface ImperialConcubine {
void exhibition();//妃子展示才艺
}
具体策略(Concrete Strategy)类
/**
* 身材好的
*/
public class Figure implements ImperialConcubine {
private String name;
private String characteristic;
public Figure(String name, String characteristic) {
this.name = name;
this.characteristic = characteristic;
}
@Override
public void exhibition() {
System.out.println(this.name + "低头不见脚尖");
}