策略模式思想及示例代码(Strategy)
原创
©著作权归作者所有:来自51CTO博客作者DeBuggggggg的原创作品,请联系作者获取转载授权,否则将追究法律责任
策略模式:
策略模式是:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
Spring 中在实例化对象的时候用到 Strategy 模式,在 SimpleInstantiationStrategy 有使用。
归类:行为型模式
特点:最终执行结果是固定的,执行过程和执行逻辑不一样
场景:旅游出行方式,下单支付方式,快递方式
示例:下单支付方式的选择,此处选择的是枚举方式来枚举支付方式
订单类:
import com.example.demo.strategy.payport.PayType;
public class Order {
private String uid;
private String orderNumber;
private double amount;
public Order(String uid, String orderNumber,Double amount){
this.uid = uid;
this.orderNumber = orderNumber;
this.amount = amount;
}
public PayState pay(PayType payType){
return payType.get().pay(this.uid,this.amount);
}
}
返回值类:
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;
}
@Override
public String toString() {
return "支付状态=" + code +
", 交易详情=" + data +
", msg='" + msg + '\'' +
'}';
}
}
支付方式接口类:
import com.example.demo.strategy.PayState;
public interface Payment {
PayState pay(String uid, Double amount);
}
支付方式实现类:
import com.example.demo.strategy.PayState;
public class Alipay implements Payment {
@Override
public PayState pay(String uid, Double amount) {
System.out.println("欢迎使用支付宝!");
System.out.println("使用支付宝余额支付!");
return new PayState(200,"支付成功", amount);
}
}
import com.example.demo.strategy.PayState;
public class UnionPay implements Payment {
@Override
public PayState pay(String uid, Double amount) {
System.out.println("欢迎使用银联支付!");
System.out.println("使用银行卡余额支付!");
return new PayState(200,"支付成功", amount);
}
}
import com.example.demo.strategy.PayState;
public class WechatPay implements Payment {
@Override
public PayState pay(String uid, Double amount) {
System.out.println("欢迎使用微信!");
System.out.println("使用微信余额支付!");
return new PayState(200,"支付成功", amount);
}
}
枚举类:
public enum PayType {
ALIPAY(new Alipay()),
WECHATPAY(new WechatPay()),
UNIONPAY(new UnionPay());
private Payment payment;
PayType(Payment payment){
this.payment = payment;
}
public Payment get(){
return this.payment;
}
}
测试类:
import com.example.demo.strategy.payport.PayType;
public class PayStrategyTest {
public static void main(String[] args) {
Order order = new Order("1", "202003240001", 249.0);
System.out.println(order.pay(PayType.WECHATPAY));
}
}