本文共 2195 字,大约阅读时间需要 7 分钟。
策略模式注重的是对算法的封装,用户不需要知道每个算法的实现细节,之需要给用户提供不同算法的选择权。例如支付场景支持支付宝、微信、银联、财付通,用户只需要从中选择一种方式进行支付即可。
使用策略模式可以减少代码中if-else判断逻辑,可以更好的进行扩展。
定义策略接口类,及其实现类
import com.william.javacore.pattern.strategy.PayState;//策略接口类public interface Payment { PayState pay(String uid, double amount);}import com.william.javacore.pattern.strategy.PayState;public class AliPay implements Payment { public PayState pay(String uid, double amount) { System.out.println("欢迎使用支付宝"); System.out.println("查询账户余额,开始扣款"); return new PayState(200,"支付成功",amount); }}import com.william.javacore.pattern.strategy.PayState;public class JDPay implements Payment { public PayState pay(String uid, double amount) { System.out.println("欢迎使用京东白条"); System.out.println("查询账户余额,开始扣款"); return new PayState(200,"支付成功",amount); }}
package com.william.javacore.pattern.strategy;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); }}
import com.william.javacore.pattern.strategy.paytype.PayType;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; } //payType这个参数,完全可以用Payment这个接口来代替 //那么需要将Payment作为一个成员变量,然后在有参构造函数中对Payment进行复制 public PayState pay(PayType payType){ return payType.get().pay(this.uid,this.amount); }}
测试:
import com.william.javacore.pattern.strategy.paytype.PayType;import java.util.ArrayList;import java.util.List;public class PayTest { public static void main(String[] args) { // 选购商品,点击订单支付 Order order = new Order("1","2018120381489799722801",69.50); /** * 各种支付方式,支付算法已经提前封装好了,用户不需要关心算法的实现 * 只需要做出适当的选择即可。 */ System.out.println(order.pay(PayType.ALI_PAY)); System.out.println(order.pay(PayType.JD_PAY)); }}
例如Spring的aop实现中,当判断是使用jdk动态代理,还是使用cglib动态代理时,就是根据策略模式进行的。
转载地址:http://unpob.baihongyu.com/