设计模式实战,工厂+策略+单例 解决 if else 过多问题

场景

在支付选择中,可以选择京东白条、支付宝、微信、银联支付等。



    public void payment(String payType) {

        if (payType.equals("JD")) {
            
            //京东支付
            
        } else if (payType.equals("Alibaba")) {
            //支付宝支付
            
        } else if (payType.equals("Tecent")) {
            //微信支付
            
        } else if (payType.equals("Union")) {
            //银联支付            
            
        } else {
            //其它支付........

        }

    }

解决方案

工厂设计模式+策略模式+单例模式,UML图如下:

在这里插入图片描述

策略

public abstract class PaymentStrategy {


    public abstract String getName();

    protected abstract double queryBalance(String uid);


    public MsgResult pay(String uid, double amount) {
        if (queryBalance(uid) < amount) {
            return new MsgResult(500, "支付失败", "余额不足");
        }
        return new MsgResult(200, "支付成功", "支付余额: " + (queryBalance(uid) - amount));
    }


}

public class UnionPayStrategy extends PaymentStrategy {
    @Override
    public String getName() {
        return "银联支付";
    }

    @Override
    protected double queryBalance(String uid) {
        return 100;
    }
}

public class TecentPayStrategy extends PaymentStrategy {
    @Override
    public String getName() {
        return "微信支付";
    }

    @Override
    protected double queryBalance(String uid) {
        return 1000;
    }
}

public class JdPayStrategy extends PaymentStrategy {
    @Override
    public String getName() {
        return "京东白条";
    }

    @Override
    protected double queryBalance(String uid) {
        return 1000;
    }
}

public class AlibabaPayStrategy extends PaymentStrategy {

    @Override
    public String getName() {
        return "支付宝支付";
    }

    @Override
    protected double queryBalance(String uid) {
        return 1000;
    }
}



枚举

public enum PaymentEnum {


    ALIBABA("ALIBABA", new AlibabaPayStrategy()),
    JD("JD", new JdPayStrategy()),
    TECENT("TECENT", new TecentPayStrategy()),
    UNION("UNION", new UnionPayStrategy()),
    DEFAULT("DEFAULT", new AlibabaPayStrategy());

    private final String payName;

    private final PaymentStrategy paymentStrategy;


    PaymentEnum(String payName, PaymentStrategy paymentStrategy) {
        this.payName = payName;
        this.paymentStrategy = paymentStrategy;
    }

    public String getPayName() {
        return payName;
    }

    public PaymentStrategy getPaymentStrategy() {
        return paymentStrategy;
    }
}

工厂+单例

public class PaymentFactory {

    /**
     * 注册表
     */
    private static Map<String, PaymentStrategy> register = new HashMap<>();

    static {
        for (PaymentEnum p : PaymentEnum.values()) {
            register.put(p.getPayName(), p.getPaymentStrategy());
        }
    }

    /**
     * 单例+饿汉(注册表)
     */
    public static PaymentStrategy getInstance(String payType) {
        if (register.containsKey(payType)) {
            return register.get(payType);
        }
        return PaymentEnum.DEFAULT.getPaymentStrategy();
    }


}

业务类


@AllArgsConstructor
@Data
@NoArgsConstructor
@ToString
public class MsgResult {

    private int code;

    private Object data;

    private String msg;


}




@AllArgsConstructor
@Data
@NoArgsConstructor
@ToString
public class Order {

    private String uid;

    private String orderId;

    private Double amount;


    public MsgResult pay(String payType) {

        PaymentStrategy paymentStrategy = PaymentFactory.getInstance(payType);
        System.out.println("欢迎使用" + paymentStrategy.getName());
        System.out.println("本次交易金额为:"  + amount + ",....开始扣款");
        return paymentStrategy.pay(uid,amount);

    }

}

测试类

public class PayTest {

    public static void main(String[] args) {

        Order order = new Order("6", "6", 500.0);
        MsgResult msg = order.pay(PaymentEnum.ALIBABA.getPayName());
        System.out.println(msg.toString());

    }

}

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

响彻天堂丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值