策略模式的结构一般由三部分组成:
-
Strategy:策略接口,定义了一系列算法接口。
-
ConcreteStrategy:具体的策略实现类,负责具体的算法实现。
-
Context:上下文,持有具体的策略接口实现类,并根据客户端的算法选择,负责与具体策略实现类交互,执行相应的算法。
对于文章开头提到的支付问题,不同的支付业务对应不同的算法,而使用这些算法的就是客户端,它们之间是耦合在一起的。所以我们需要将不同支付(算法实现)抽离出来,封装成一个个单独的支付类(算法类),同时定义一个算法公共接口,不同算法实现类都实现此接口。
以后要是增加新的支付方式,只需要增加一个新的算法实现类即可,也不会对其他算法实现类造成影响,达到了可扩展和可维护的效果。
首先定义策略接口,所有具体的策略实现类都要实现它。
package com.chenpi.strategy;
/**
-
@Description 策略接口
-
@Author 陈皮
-
@Date 2021/7/31
-
@Version 1.0
*/
public interface PayStrategy {
void pay(double money);
}
然后定义不同的具体策略实现类,并且实现策略接口。
package com.chenpi.strategy;
/**
-
@Description 支付宝支付策略实现类
-
@Author 陈皮
-
@Date 2021/7/31
-
@Version 1.0
*/
public class AliPayStrategy implements PayStrategy {
@Override
public void pay(double money) {
System.out.println(“使用支付宝支付金额:” + money);
}
}
package com.chenpi.strategy;
/**
-
@Description 微信支付策略实现类
-
@Author 陈皮
-
@Date 2021/7/31
-
@Version 1.0
*/
public class WeChatPayStrategy implements PayStrategy {
@Override
public void pay(double money) {
System.out.println(“使用微信支付金额:” + money);
}
}
package com.chenpi.strategy;
/**
-
@Description 银联支付策略实现类
-
@Author 陈皮
-
@Date 2021/7/31
-
@Version 1.0
*/
public class UnionPayStrategy implements PayStrategy {
@Override
public void pay(double money) {
System.out.println(“使用银联支付金额:” + money);
}
}
在策略模式中,为了让算法独立于使用算法的客户端,引入上下文对象,它持有具体的算法实现类,根据客户端选择具体的算法后,执行对应的具体算法。如此一来,算法的变化而不影响到客户端,客户端通过上下文对象还可以动态切换不同的算法。
package com.chenpi.strategy;
/**
-
@Description 上下文对象
-
@Author 陈皮
-
@Date 2021/7/31
-
@Version 1.0
*/
public class PayContext {
// 持有具体的策略实现类,一般由客户端决定设置
private PayStrategy payStrategy;
// 构造方法,接受一个具体的策略实现类
public PayContext(PayStrategy payStrategy) {
this.payStrategy = payStrategy;
}
// 暴露给客户端调用的方法,实现调用具体策略类的方法来实现
public void pay(double money) {
payStrategy.pay(money);
}
}
最后客户端就可以进行调用了。
package com.chenpi.strategy;
/**
-
@Description 策略模式
-
@Author 陈皮
-
@Date 2021/7/31
-
@Version 1.0
*/
public class ChenPiClient {
public static void main(String[] args) {
new PayContext(new AliPayStrategy()).pay(78.5);
}
}
//输出结果
使用支付宝支付金额:78.5
如果此时增加一种新的支付方式,信用卡支付,那么只需要新增一个策略实现类即可。
package com.chenpi.strategy;
/**
-
@Description 信用卡支付策略实现类
-
@Author 陈皮
-
@Date 2021/7/31
-
@Version 1.0
*/
public class CreditCardPayStrategy implements PayStrategy {
@Override
public void pay(double money) {
System.out.println(“使用信用卡支付金额:” + money);
}
}
支付模块的策略模式的结构关系如下图所示。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。