策略模式的学习
策略模式定义
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。看完定义是不是和没看过一下,完全不知道怎么回事,下面就通过UML图和例子进行详细的说明。
策略模式UML图
Pay:支付的抽象接口,即策略的抽象接口
AliPay、WXPay、JDPay:具体的策略类
PayContext:环境上下文
package com.strawberry.strategyPattern.two;
public interface Pay {
void payment(Integer amountMoney);
}
package com.strawberry.strategyPattern.two;
/**
* @Description 支付宝支付
* @Author zhangwy
* @Date 2021/5/1811:19
* @Version 1.0
*/
public class AliPay implements Pay{
public void payment(Integer amountMoney) {
Double YAmountMoney = amountMoney / 100.0;
System.out.println("支付宝支付:" + YAmountMoney + "元");
}
}
package com.strawberry.strategyPattern.two;
/**
* @Description 微信支付
* @Author zhangwy
* @Date 2021/5/1811:21
* @Version 1.0
*/
public class WXPay implements Pay{
public void payment(Integer amountMoney) {
Double YAmountMoney = amountMoney / 100.0;
System.out.println("微信支付:" + YAmountMoney + "元");
}
}
package com.strawberry.strategyPattern.two;
/**
* @Description 京东支付
* @Author zhangwy
* @Date 2021/5/1811:21
* @Version 1.0
*/
public class JDPay implements Pay{
public void payment(Integer amountMoney) {
Double YAmountMoney = amountMoney / 100.0;
System.out.println("京东支付:" + YAmountMoney + "元");
}
}
package com.strawberry.strategyPattern.two;
/**
* @Description TODO
* @Author zhangwy
* @Date 2021/5/1811:23
* @Version 1.0
*/
public class PayContext {
private Pay pay;
public Pay getPay() {
return pay;
}
public void setPay(Pay pay) {
this.pay = pay;
}
public PayContext(Pay pay) {
this.pay = pay;
}
public void executePay(Integer amountMoney){
pay.payment(amountMoney);
}
}
package com.strawberry.strategyPattern.two;
/**
* @Description 客户端
* @Author zhangwy
* @Date 2021/5/1811:25
* @Version 1.0
*/
public class Client {
public static void main(String[] args) {
Integer amountMoney = 1000;
Pay pay = new WXPay();
PayContext payContext = new PayContext(pay);
payContext.executePay(amountMoney);
pay = new AliPay();
payContext.setPay(pay);
payContext.executePay(amountMoney);
}
}
运行输出结果:
微信支付:10.0元
支付宝支付:10.0元
从上面结果可以看出PayContext拥有的哪个支付对象就执行哪个支付,策略模式就是把每个算法封装到单独的类中,使每个类的职责单一,便于修改和复用。
那么策略模式在大名鼎鼎的spring中的哪里使用到的,怎么使用的呢?请继续往下看
Spring中的策略模式
spring中的HandlerMapping使用策略模式实现的,spring中的HandlerMapping支持多种方式进行映射,通过下图可以看出:
上图可以看出,每个策略都经过进一步的抽取,从策略模式的角度出发,可以去除一些不需要关心的类,如下图所示:
从上面可以看出HandlerMapping一共有6个策略可以选择,至于每个类的区别不是本文的重点,不过一把开发都是使用RequestMappingHandlerMapping这个策略。