设计模式学习-策略模式-JAVA

策略,也可以说是方法
比如:出去吃顿饭选择步行还是驾车,付款时选择用支付宝还是微信,餐具用筷子还是刀叉等等诸如此类。
总之我们的方法有很多种

策略模式

引申进代码中,把这些策略(Strategy)给抽出来,整成一个接口,这里以支付场景为例

/**
 * 定义支付策略接口,让代码更加通用
 */
public interface PayStrategy {
    /**
     * 执行付款
     * @param payContext
     */
    void doPay(PayContext payContext);
}

这里我定义了一个简单支付信息上下文PayContext

public class PayContext {
    /**
     * 付款人
     */
    private Long userID;
    /**
     * 付款方式(支付宝/微信)
     */
    private String payMethod;
    /**
     * 付款金额
     */
    private int moneyPay;
}

现在只剩下一个工作了,即写微信支付方法(wxPay)和支付宝支付方法(zfbPay)

public class wxPay implements PayStrategy {
    @Override
    public void doPay(PayContext payContext) {
        Long userID = payContext.getUserID();
        int moneyPay = payContext.getMoneyPay();
        System.out.println("这里是微信方法");
        System.out.println("支付人:"+userID+"支付金额:"+moneyPay);
    }
}
public class zfbPay implements PayStrategy {
    @Override
    public void doPay(PayContext payContext) {
        Long userID = payContext.getUserID();
        int moneyPay = payContext.getMoneyPay();
        System.out.println("这里是支付宝方法");
        System.out.println("支付人:"+userID+"支付金额:"+moneyPay);
    }
}

理论上已经完成了,但是如果调用方使用时还需要写个if else判断payMethod是支付宝还是微信,因此,这里我们定义一个PayManager,目的是简化对支付功能的调用,让调用方写最少的代码,调用最简单。对于支付方式的选取,也是在这里处理的

@Service
public class PayManager {
    void doPay(PayContext payContext){
        String payMethod = payContext.getPayMethod();
        PayStrategy payStrategy = null;
        if ("微信".equals(payMethod)){
            payStrategy = new wxPay();
        }else if ("支付宝".equals(payMethod)){
            payStrategy = new zfbPay();
        }
        payStrategy.doPay(payContext);
    }
}

最后在PayManager这个类下按CTRL+shift+T,创建测试

class PayManagerTest {

    @Test
    void doPay() {
        PayContext payContext = new PayContext();
        payContext.setUserID(123L);
        payContext.setPayMethod("支付宝");
        payContext.setMoneyPay(100);
        PayManager payManager = new PayManager();
        payManager.doPay(payContext);

    }
}

输出结果

在这里插入图片描述
demo结构图
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值