策略模式

127 阅读1分钟

策略接口

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"));     
} 
}