策略模式思想及示例代码(Strategy)

star2017 1年前 ⋅ 1979 阅读

策略模式:

策略模式是:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
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));
    }
}
更多内容请访问:IT源点

相关文章推荐

全部评论: 0

    我有话说: