简介
说明
本文介绍Java中策略模式的写法:手动组装Map。
本文通过抽象类来实现策略模式:接口+不同的实现类,通过Map来手动添加和获取实现类。
本写法的优缺点
优点
- 纯手写,有利于理解策略模式。
缺点
- 策略是手动注册的,不是自动注册。
- 添加新的策略时,要新建一个策略实现类,还要去手动注册。(手动注册这一步破坏了开闭原则)
- 策略持有者里边持有的是实现类。
实战
项目需求
有不同的支付方式:支付宝、微信、银行卡,前端传了一个payType,根据payType去判断调用哪种支付方式。
思路
- 提供一个支付功能接口,不同的支付方式去实现这个接口
- 创建一个Map,key为支付类型,value为实现类的引用,手动将所有的实现类放进去。
- 执行时:根据支付方式从Map中取出对应的实现类,调用支付方法。
代码结构

源码地址
此隐藏内容仅限VIP查看升级VIP
支付类型枚举类
package com.knife.designPattern.constant;
public enum PayType {
ALIPAY("支付宝支付"),
WECHAT_PAY("微信支付"),
BANK_CARD_PAY("银行卡支付")
;
/**
* 描述
*/
private final String description;
PayType(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
}
抽象策略(支付)
package com.knife.designPattern.strategy;
public interface Pay {
/**
* 调用远程的支付接口
*/
void invokeRemoteInterface();
}
具体策略
支付宝支付策略
package com.knife.designPattern.strategy.impl;
import com.knife.designPattern.constant.PayType;
import com.knife.designPattern.strategy.Pay;
public class AliPayImpl implements Pay {
@Override
public void invokeRemoteInterface() {
System.out.println("调用远程接口:" + PayType.ALIPAY.getDescription());
}
}
微信支付策略
package com.knife.designPattern.strategy.impl;
import com.knife.designPattern.constant.PayType;
import com.knife.designPattern.strategy.Pay;
public class WeChatPayImpl implements Pay {
@Override
public void invokeRemoteInterface() {
System.out.println("调用远程接口:" + PayType.WECHAT_PAY.getDescription());
}
}
银行卡支付策略
package com.knife.designPattern.strategy.impl;
import com.knife.designPattern.constant.PayType;
import com.knife.designPattern.strategy.Pay;
public class BankCardPayImpl implements Pay {
@Override
public void invokeRemoteInterface() {
System.out.println("调用远程接口:" + PayType.BANK_CARD_PAY.getDescription());
}
}
支付策略持有类
package com.knife.designPattern.strategy;
import com.knife.designPattern.constant.PayType;
import com.knife.designPattern.strategy.impl.AliPayImpl;
import com.knife.designPattern.strategy.impl.BankCardPayImpl;
import com.knife.designPattern.strategy.impl.WeChatPayImpl;
import java.util.HashMap;
import java.util.Map;
public class PayStrategyHolder {
private static Map<PayType, Pay> payMap = null;
static {
payMap = new HashMap<>();
payMap.put(PayType.ALIPAY, new AliPayImpl());
payMap.put(PayType.WECHAT_PAY, new WeChatPayImpl());
payMap.put(PayType.BANK_CARD_PAY, new BankCardPayImpl());
}
public static void pay(PayType payType) {
for (Map.Entry<PayType, Pay> payEntry : payMap.entrySet()) {
if (payEntry.getKey().equals(payType)) {
payEntry.getValue().invokeRemoteInterface();
}
}
}
}
测试
代码
package com.knife.designPattern.controller;
import com.knife.designPattern.constant.PayType;
import com.knife.designPattern.strategy.PayStrategyHolder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class PayController {
@GetMapping("/pay")
public String pay(PayType payType) {
PayStrategyHolder.pay(payType);
return "test success";
}
}
测试
访问:http://localhost:8080/pay?payType=ALIPAY

后端结果
调用远程接口:支付宝支付

请先 !