设计模式——策略模式

策略模式是定义了算法家族并分别封装起来,让它们之间可以相互替换,此模式是的算法的变化不会影响使用算法的用户

1.策略模式的应用场景

1.系统中有很多类他们的区别仅仅在于行为的不同
2.一个系统需要动态的在集中算法中选择一种

2.策略模式业务场景

首先创建支付状态包装类

public class PayState {
	
	private int code;
	
	private Object data;
	
	private String msg;

	public PayState(int code,String msg,Object data) {
		this.code = code;
		this.data = data;
		this.msg = msg;
	}
	
	public String toString() {
		return ("支付状态:["+code+"],"+msg+",交易详情"+data);
	}
	

}

创建支付抽象类,用于定义支付规范和支付逻辑

public abstract class Payment {
	//支付类型
	public abstract String getName();
	//查询余额
	protected abstract double queryBalance(String uid);
	
	public PayState pay(String uid,double amount){
		if(queryBalance(uid)<amount) {
			return new PayState(500,"支付失败","余额不足");
		}
		return new PayState(200,"支付成功","支付金额"+amount);
	}
}

分别创建具体的支付方式

public class AliPay extends Payment {

	@Override
	public String getName() {
		return "支付宝";
	}

	@Override
	protected double queryBalance(String uid) {
		return 900;
	}

}
public class JDPay extends Payment {

	@Override
	public String getName() {
		return "京东白条";
	}

	@Override
	protected double queryBalance(String uid) {
		return 500;
	}

}
public class UnionPay extends Payment {

	@Override
	public String getName() {
		return "银联支付";
	}

	@Override
	protected double queryBalance(String uid) {
		return 120;
	}

}
public class WechatPay extends Payment {

	@Override
	public String getName() {
		return "微信支付";
	}

	@Override
	protected double queryBalance(String uid) {
		return 256;
	}

}

创建支付策略管理类

public class PayStrategy {
	
	public static final String ALI_PAY="AliPay";
	public static final String JD_PAY="JdPay";
	public static final String UNION_PAY="UnionPay";
	public static final String WECHAT_PAY="WechatPay";
	public static final String DEFAULT_PAY=ALI_PAY;
	
	private static Map<String,Payment> payStrategy = new HashMap<String,Payment>();
	
	static {
		payStrategy.put(ALI_PAY,new AliPay());
		payStrategy.put(JD_PAY,new JDPay());
		payStrategy.put(UNION_PAY,new UnionPay());
		payStrategy.put(WECHAT_PAY,new WechatPay());
	}
	
	public static Payment get(String payKey) {
		if(!payStrategy.containsKey(payKey)) {
			return payStrategy.get(DEFAULT_PAY);
		}
		return payStrategy.get(payKey);
	}

}

创建订单类

public class Order {
	
	private String uid;
	private String orderId;
	private double amount;
	
	public Order(String uid, String orderId, double amount) {
		this.uid = uid;
		this.orderId = orderId;
		this.amount = amount;
	}
	
	public PayState pay() {
		return pay(PayStrategy.DEFAULT_PAY);
	}
	
	public PayState pay(String paykey) {
		Payment payment = PayStrategy.get(paykey);
		System.out.println("欢迎使用"+payment.getName());
		System.out.println("本次交易金额为"+amount);
		return payment.pay(uid, amount);
	}

}

进行测试

public class PayStrategyTest {
	
	public static void main(String args[]) {
		Order order = new Order("1", "0000001",324.25);
		System.out.println(order.pay(PayStrategy.JD_PAY));
	}

}

测试结果为

欢迎使用京东白条
本次交易金额为324.25
支付状态:[200],支付成功,交易详情支付金额324.25

3.策略模式的优缺点

策略模式优点如下:
1.策略模式符合开闭原则
2.策略模式可避免使用多重条件语句如If…else语句,switch语句
3.使用策略模式可以提高算法的保密性和安全性
策略模式缺点如下:
1.客户端必须知道所有策略并自行决定使用哪一个策略
2.代码中会产生非常多的策略类,增加了维护难度

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值