正文
业务场景:根据条件判断调用支付宝,微信,或其他第三方支付;
if(type==1){
阿里支付();
}else if(type==2){
微信支付();
}else{
第三方支付();
}
如果还有更多的支付类型,就在后面使用else if()
这也太那啥了吧。。。
代码
公共代码
AliPayStrategy
/**
* @author HJH
* @Description: 支付宝
* @date 2019/8/12 15:56
*/
public class AliPayStrategy implements PayStrategy {
@Override
public void pay(float money) {
//调用支付宝的接口具体代码 略...
if (money <= 200) {
System.out.println("通过调用支付宝的接口" + "直接支付了" + money);
} else {
System.out.println("通过调用支付宝的接口" + "输入密码验证再支付了" + money);
}
}
}
WeChatPayStrategy
/**
* @author HJH
* @Description: 微信
* @date 2019/8/12 15:57
*/
public class WeChatPayStrategy implements PayStrategy {
@Override
public void pay(float money) {
//调用微信的接口略。。。。
System.out.println("通过调用微信支付的接口支付了" + money);
}
}
PayStrategy
/**
* @author HJH
* @Description: 从调用微信、支付宝、第三方等可以抽出一个公共的策略接口,同时也是为了实现定义中的互换
* @date 2019/8/12 15:55
*/
public interface PayStrategy {
public void pay(float money);
}
Client
/**
* @author HJH
* @Description:
* @date 2019/8/12 16:01
*/
public class Client {
public static void main(String[] args) {
// if(type==1){
// 阿里支付();
// }else if(type==2){
// 微信支付();
// }else{
// 第三方支付();
// }
//结合策略模式
ContextStrategy strategy = new ContextStrategy();
strategy.setStrategy(new AliPayStrategy());
strategy.payout(1000f);
strategy.setStrategy(new WeChatPayStrategy());
strategy.payout(20f);
//结合简单工厂模式
PayStrategy payStrategy = Factory.create(Factory.TYPE_ALI);
payStrategy.pay(1000.0f);
payStrategy = Factory.create(Factory.TYPE_WECHAT);
payStrategy.pay(20.0f);
}
}
使用策略模式
ContextStrategy
/**
* @author HJH
* @Description: 具体抽象类
* @date 2019/8/12 15:55
*/
public class ContextStrategy {
private PayStrategy strategy;
public ContextStrategy() {
}
public void payout(float money) {
strategy.pay(money);//调用策略
}
public void setStrategy(PayStrategy strategy) {
this.strategy = strategy;//设置策略类
}
}
使用工厂模式
/**
* @author HJH
* @Description: 负责实例化对应产品的对象
* @date 2019/8/12 16:00
*/
//负责实例化对应产品的对象
public class Factory {
public static final String TYPE_ALI="ali";
public static final String TYPE_WECHAT="wechat";
private Factory() {
}
public static PayStrategy create(String type){
PayStrategy product=null;
if(TYPE_ALI.equals(type)){
product=new AliPayStrategy();
}else if(TYPE_WECHAT.equals(type)){
product=new WeChatPayStrategy();
}
return product;
}
}
结语
其实代码很简单,无非也就是把判断条件与业务代码独立出来维护,减少了if else
代码,提高代码的可阅读性与可维护性。缺点就是如果后期的策略过多(你懂的,类就很多),但是其实这点缺陷还是能容忍的。