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

news/2024/7/7 19:23:13

场景

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



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

    }

}

在这里插入图片描述


http://www.niftyadmin.cn/n/4556698.html

相关文章

学好C语言要注意哪些啊

C语言学得很浅 如果你是计算机专业的C语言学习 高校中的C语言开课初衷也是为了让学生更快的熟悉计算机软件中最底层的思想 个人感觉大学中的C语言 文件操作当年就被我老师忽略掉 学完指针和结构体之后应该就不会再讲了 我建议你首先学习C语言的编程思想 如果你所在为一所普通高…

设计模式 – 模板设计模式

模板设计模式 模板方法模式&#xff08;Template Method Pattern&#xff09;&#xff0c;又叫模板模式(Template Pattern)&#xff0c;在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现&#xff0c;但调用将以抽象类中定义的方式进行。 该模式的主…

关于C语言initgraph图象函数

参考资料&#xff1a;http://course.cug.edu.cn/cugFirst/Adv_program/C_ziliao/ctuxin1.htm 答案补充 是的 若没有驱动程序 当程序进行到intitgraph()语句时 在编译和链接时并没有将相应的驱动程序(*.BGI)装入到执行程序 都这个年代了 现在根本就不用 还用它编过几个挺成样的软…

设计模式 – 适配器模式

1 介绍 适配器模式(Adapter Pattern)将某个类的接口转换成客户端期望的另一个接口表示&#xff0c;主要目的是兼容性&#xff0c;将一个类的接口转换成客户希望的另外一个接口&#xff0c;使得原本由于接口不兼容而不能一起工作的那些类能一起工作 目的&#xff1a;让原本接口…

C语言编辑进

PS&#xff1a;如果代码有问题 最后执行 然后build *.exe 那就在最上边工具条里点build->compile *.c 勾选buildminibar就会有上边那个工具条了如果还没找到 那在上边右键 执行如果没有 停止连接 连接 重新下个 在上边工具栏上有一排6个工具&#xff1a;编译 最后所产生的.e…

设计模式 – 装饰者模式

概念 (1) 装饰&#xff08;Decorator&#xff09;模式的定义&#xff1a;指在不改变现有对象结构的情况下&#xff0c;动态地给该对象增加一些职责&#xff08;即增加其额外功能&#xff09;的模式&#xff0c;它属于对象结构型模式。 (2) 装饰&#xff08;Decorator&#xf…

设计模式 – 观察者模式

概念 1、观察者&#xff08;Observer&#xff09;模式的定义&#xff1a;指多个对象间存在一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式&#xff0c;它是对…

c++类和对象等编程

仅供参考 另外我的程序可能有错误 你如果高兴的话 可以在构造函数中初始变量什么的 这个只是我个人意见 #include <iostream>#include <string>using namespace std;class rech{public: std::int long0; std::int wide0;}把这个存放在rech.h中#include <iostrea…