设计模式之策略模式

1.策略模式使用场景

策略模式注重的是对算法的封装,用户不需要知道每个算法的实现细节,之需要给用户提供不同算法的选择权。例如支付场景支持支付宝、微信、银联、财付通,用户只需要从中选择一种方式进行支付即可。

使用策略模式可以减少代码中if-else判断逻辑,可以更好的进行扩展。

 

2.代码实现

定义策略接口类,及其实现类

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));
	}
}

3.源码中的体现

例如Spring的aop实现中,当判断是使用jdk动态代理,还是使用cglib动态代理时,就是根据策略模式进行的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值