策略接口
package StrategyPattern; /* ** **@Author: ***qqwen ** **@Date: ***2020/8/7 15:39 ** **@Description: ***/ public interface IPayStrategy { String message = "使用%s,支付了%s元"; String pay(String channel, String amount); }
public interface IPayStrategy {
String message = "使用%s,支付了%s元";
String pay(String channel, String amount);
}
不同实现
@Component("aliPayStrategy")
public class ALiPayStrategyImpl implements IPayStrategy {
@Override
public String pay(String channel, String amount) {
return String.format(message,PayEnum.*ALI_PAY*.getDescription(),amount);
}
}
@Component("wechatPayStrategy")
public class WechatPayStrategyImpl implements IPayStrategy {
@Override
public String pay(String channel, String amount) {
return String.format(message,PayEnum.WECHAT_PAY.getDescription(),amount);
}
}
@Component("xiaomiPayStrategy")
public class XiaomiPayStrategyImpl implements IPayStrategy {
@Override
public String pay(String channel, String amount) { return String.format(message,PayEnum.XIAO_MI_PAY.getDescription(),amount);
}
}
枚举
public enum PayEnum {
ALI_PAY("ali", "阿里支付", "aliPayStrategy"),
XIAO_MI_PAY("xiaomi", "小米支付", "xiaomiPayStrategy"),
WECHAT_PAY("wechat", "微信支付", "wechatPayStrategy");
private String channel;
private String description;
private String beanName;
public String getChannel() {
return channel;
}
public void setChannel(String channel) {
this.channel = channel;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getBeanName() {
return beanName;
}
public void setBeanName(String beanName) {
this.beanName = beanName;
}
PayEnum(String channel, String description, String beanName) { this.channel = channel;
this.description = description;
this.beanName = beanName;
}
public static PayEnum findPayEnumbyChannel(String channel) {
PayEnum[] payEnums = PayEnum.values();
for (PayEnum payEnum : payEnums) {
if (channel.equals(payEnum.getChannel())) {
return payEnum;
}
}
return null;
}
}
spring中获取实例
@Component public class SpringContextUtil implements ApplicationContextAware { */** * 上下文对象实例
*/* private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextUtil.applicationContext= applicationContext;
}
public static Object getBean(String beanName) {
return applicationContext.getBean(beanName);
}
public static <T> T getBean(String beanName, Class<T> clazz) {
return applicationContext.getBean(beanName, clazz);
}
}
类工厂
public class PayStrategyFactory {
public static IPayStrategy getPayStrategy(String channel) {
PayEnum payEnum = PayEnum.findPayEnumbyChannel(channel);
if (payEnum == null) {
return null;
}
return SpringContextUtil.getBean(payEnum.getBeanName(), IPayStrategy.class);
}
}
测试
public class TestPayStrategy {
public static void main(String[] args) {
String channel = "ali";
IPayStrategy payStrategy = PayStrategyFactory.getPayStrategy(channel); if (payStrategy == null) {
System.out.println("输入渠道有误");
}
System.out.println(payStrategy.pay(channel, "100"));
}
}