案例一用的是接口,在我的文章的第一篇中有;下面演示以下案例二的操作方式:
使用枚举的方式:实现策略模式的选择(支付的简单案例):
定义一个枚举类:
包含各种支付的示例:
并写一个执行支付的抽象方法paying(double amount);每个都枚举实例都重写上。
import lombok.Getter;
@Getter
public enum PayWays {
QQ_PAY("qqpay"){
public void paying(double amount) {
System.out.println("使用QQ支付:"+amount+"元");
// 实现QQ支付的具体逻辑
}
},
ALI_PAY("alipay"){
public void paying(double amount) {
System.out.println("使用支付宝支:" + amount + "元");
// 实现支付宝支付的具体逻辑
}
},
WECHAT_PAY("wechatpay"){
public void paying(double amount) {
System.out.println("使用微信支付:" + amount + "元");
// 实现微信支付的具体逻辑
}
},
YUNFLASH_PAY("yunflashpay"){
public void paying(double amount) {
System.out.println("使用云闪付支付:"+amount+"元");
// 实现云闪付支付的具体逻辑
}
},
DIGITALRMB_PAY("digitalpay"){
public void paying(double amount) {
System.out.println("使用数字人民币支付:"+amount+"元");
// 实现数字人民币支付的具体逻辑
}
},
;
//构造方法,初始化属性值。
PayWays(String payWay) {
this.payWay = payWay;
}
//属性payWay。
public final String payWay;
//逻辑方法
public static PayWays getEnum(String payWay){
for (PayWays pay : PayWays.values()) {
if (pay.payWay==payWay){
return pay;
}
}
return null;
}
//执行支付的抽象方法;每个都枚举实例都重写上。
public abstract void paying(double amount);
}
测试:
@Test
public void testEnumPay(){
int amount=20;
String payWay=PayConstant.ALI_PAY;
try {
PayWays payWays=PayWays.getEnum(payWay);
if (payWays!=null){
payWays.paying(amount);
}
else{ throw new Exception();}
}catch (Exception e){
System.out.println("不支持的支付方式,请重新选择");
}
}
测试结果:
使用支付宝支:20.0元
未知的支付测试:
测试结果:
不支持的支付方式,请重新选择
以上是本期的内容。
改进:
改进地方主要是枚举类的getEum(double amout)的方法;用整型Int数字代替:
代码:
public enum PayWaysInt {
QQ_PAY(0){
public void paying(double amount) {
System.out.println("使用QQ支付:"+amount+"元");
}
},
ALI_PAY(1){
public void paying(double amount) {
System.out.println("使用支付宝支付:"+amount+"元");
}
},
WECHAT_PAY(2){
public void paying(double amount) {
System.out.println("使用微信支付:"+amount+"元");
}
},
YUNFLASH_PAY(3){
public void paying(double amount) {
System.out.println("使用云闪付支付:"+amount+"元");
}
},
DIGITALRMB_PAY(4){
public void paying(double amount) {
System.out.println("使用数字人民币支付:"+amount+"元");
}
};
private int payWay;
PayWaysInt(int payWay) {
this.payWay = payWay;
}
public static PayWaysInt getPay(int payNum){
PayWaysInt[] waysInt = PayWaysInt.class.getEnumConstants();
return waysInt[payNum];
}
public abstract void paying(double amount);
}
测试:
@Test
public void testPayWaysInt(){
int amount=10;
int payNum=3;
try {
PayWaysInt pay = PayWaysInt.getPay(payNum);
pay.paying(amount);
} catch (Exception o) {
if (o.getMessage().contains("out of bounds")){
throw new OtherException(PayConstant.NOT_FOUNT);
}
}
}
测试结果:
使用云闪付支付:10.0元
这里有五个支付方式,则int范围是0-4:如果整型赋值超过了4,会抛枚举索引数组越界的异常,所以在改测试方法中进行了异常捕捉:
测试:
测试通过。