Java 设计模式(创建型)

文章目录

  • 工厂模式
  • 单例模式
  • 抽象工厂模式
  • 建造者模式
  • 原型模式

工厂模式

工厂模式(Factory Pattern)是一种创建型设计模式,用于创建对象的接口,但是由子类决定要实例化的类是哪一个。它提供了一种将对象的实例化过程封装起来的方法,从而使得客户端代码与具体创建对象的类解耦。

  • 结构

    1. 抽象产品(Product):定义了产品的接口或抽象类,通常是工厂所创建的对象的共同基类。
    2. 具体产品(Concrete Product):实现了抽象产品接口或继承了抽象产品类,是工厂模式所创建的具体对象。
    3. 抽象工厂(Factory):声明了工厂方法(Factory Method),用于创建抽象产品的接口或抽象类。
    4. 具体工厂(Concrete Factory):实现了抽象工厂接口或继承了抽象工厂类,负责创建具体产品的对象。
    5. 客户端(Client):使用工厂对象创建具体产品对象的类。
  • 场景

    1. 对象的创建需要复杂逻辑:当对象的创建过程比较复杂或者需要根据不同条件创建不同的对象时,工厂模式可以将创建过程封装起来,提供一个统一的接口。
    2. 需要解耦对象的使用和创建:当需要在客户端代码中解耦对象的使用和创建时,工厂模式是一个不错的选择,客户端只需要知道工厂接口或抽象类,而不需要关心具体的实现细节。
    3. 需要动态切换产品族:工厂模式可以根据需要动态地选择产品族,比如根据用户的地区或语言选择不同的产品。
  • 优点

    1. 解耦:工厂模式将客户端代码与具体的创建逻辑分离,客户端只需要知道工厂接口或抽象类,不需要关心具体的实现细节,从而降低了耦合度。
    2. 封装性:工厂模式将对象的创建过程封装在工厂类中,使得客户端无需知道创建对象的细节,同时也隐藏了创建对象的具体实现。
    3. 可扩展性:通过添加新的具体工厂类,可以很容易地向系统中添加新的产品,而不需要修改已有的代码。
  • 缺点

    1. 类的数量增加:每个具体产品都需要对应一个具体工厂类,可能会导致类的数量增加,从而增加了系统的复杂性。
    2. 不适合复杂对象的创建:当创建对象的过程比较复杂或者需要初始化大量的参数时,工厂模式可能会变得笨重,并且不够灵活。
  • 示例

// 抽象产品:手机
interface Phone {void call();
}// 具体产品:小米手机
class Xiaomi implements Phone {@Overridepublic void call() {System.out.println("使用小米手机打电话");}
}// 具体产品:华为手机
class Huawei implements Phone {@Overridepublic void call() {System.out.println("使用华为手机打电话");}
}// 抽象工厂:手机工厂
interface PhoneFactory {Phone createPhone();
}// 具体工厂:小米手机工厂
class XiaomiFactory implements PhoneFactory {@Overridepublic Phone createPhone() {return new Xiaomi();}
}// 具体工厂:华为手机工厂
class HuaweiFactory implements PhoneFactory {@Overridepublic Phone createPhone() {return new Huawei();}
}// 客户端代码
public class Main {public static void main(String[] args) {// 创建小米手机PhoneFactory xiaomiFactory = new XiaomiFactory();Phone xiaomiPhone = xiaomiFactory.createPhone();xiaomiPhone.call();// 创建华为手机PhoneFactory huaweiFactory = new HuaweiFactory();Phone huaweiPhone = huaweiFactory.createPhone();huaweiPhone.call();}
}
  • 输出结果
使用小米手机打电话
使用华为手机打电话

单例模式

单例模式(Singleton Pattern)是一种创建型设计模式,旨在确保类只有一个实例,并提供全局访问点。

  • 结构

    1. 私有构造函数:确保其他类无法通过构造函数创建实例。
    2. 静态变量:在类内部创建一个私有静态变量来保存单例实例。
    3. 静态方法:提供一个静态方法来获取单例实例,如果实例不存在,则在此方法内部创建实例并返回。
  • 场景

    1. 资源管理器:例如线程池、数据库连接池等资源管理器常常使用单例模式,以确保全局只有一个资源管理器实例。
    2. 配置管理器:应用程序的配置管理器通常以单例模式实现,以确保全局只有一个配置管理器实例。
    3. 日志记录器:日志记录器通常以单例模式实现,以确保在应用程序中的任何位置都可以轻松访问和使用日志记录功能。
    4. 窗口管理器:图形用户界面(GUI)应用程序中的窗口管理器通常以单例模式实现,以确保全局只有一个窗口管理器实例来管理所有窗口。
  • 优点

    1. 全局唯一性:确保一个类只有一个实例,全局范围内提供该实例的访问点。
    2. 延迟实例化:单例对象通常在首次被请求时才被实例化,从而节省了系统资源。
    3. 简化访问:通过全局访问点,简化了对单例对象的访问和管理。
  • 缺点

    1. 可能引起性能问题:在高并发情况下,单例模式可能成为性能瓶颈,因为所有线程都必须等待获取单例对象。
    2. 可能引起线程安全问题:如果没有正确地实现线程安全措施,可能会导致多线程环境下出现多个实例。
  • 示例1

class Singleton {// 使用 volatile 关键字确保 instance 在多线程环境下的可见性private static volatile Singleton instance;// 私有构造函数,防止外部通过构造函数创建实例private Singleton() {}// 提供全局访问点获取唯一实例public static Singleton getInstance() {// 双重检查锁定,提高效率并确保线程安全if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}// 示例方法public void exampleMethod() {System.out.println("这是单例模式中的示例方法。");}
}// 客户端代码
public class Main {public static void main(String[] args) {// 获取单例实例Singleton singleton = Singleton.getInstance();// 调用示例方法singleton.exampleMethod();}
}
  • 输出结果
这是单例模式中的示例方法。
  • 示例2
class ConfigurationManager {// 私有静态变量保存唯一实例private static ConfigurationManager instance;// 私有构造函数,防止外部通过构造函数创建实例private ConfigurationManager() {// 在这里可以进行配置的初始化工作System.out.println("配置管理器初始化完成。");}// 提供全局访问点获取唯一实例public static ConfigurationManager getInstance() {// 懒汉式单例模式实现,第一次调用时才实例化对象if (instance == null) {instance = new ConfigurationManager();}return instance;}// 示例方法:获取配置项public String getConfig(String key) {// 这里可以根据 key 获取相应的配置项return "配置项:" + key;}
}// 客户端代码
public class Main {public static void main(String[] args) {// 获取配置管理器实例ConfigurationManager configManager = ConfigurationManager.getInstance();// 使用配置管理器获取配置项String configValue = configManager.getConfig("database.url");System.out.println(configValue);}
}
  • 输出结果
配置管理器初始化完成。
配置项:database.url

抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。它属于工厂模式的一种扩展,通过提供一个抽象工厂接口,可以创建一组相关的产品对象,而不是单个产品。

  • 结构

    1. 抽象工厂接口:定义了创建一组相关产品对象的方法,每个方法对应一个产品。
    2. 具体工厂类:实现了抽象工厂接口,负责创建具体的产品对象。
    3. 抽象产品接口:定义了产品对象的接口,每个具体产品类都实现了该接口。
    4. 具体产品类:实现了抽象产品接口,代表了具体的产品对象。
  • 场景

    1. 跨平台产品:抽象工厂模式可以用于创建跨平台产品,比如同时在 Windows 和 macOS 上创建应用程序,每个平台都有自己的按钮、文本框等 UI 组件。
    2. 产品族:抽象工厂模式适用于需要一次性创建一系列相关或相互依赖的产品对象的场景,比如创建一个汽车工厂,可以生产不同品牌的汽车,每个品牌又包括不同型号的车型。
    3. 数据库访问:在数据库访问中,抽象工厂模式可以用于创建不同类型的数据库连接、命令和数据读取器,以适应不同数据库的需求。
  • 优点

    1. 封装性:抽象工厂模式将产品的创建过程封装在工厂类中,客户端不需要知道具体的创建细节,只需要通过工厂接口来创建产品。
    2. 灵活性:可以在运行时动态切换具体工厂类,从而创建不同系列的产品对象,满足不同的需求。
    3. 易于扩展:增加新的具体工厂和产品类非常容易,无需修改现有代码,符合开闭原则。
  • 缺点

    1. 复杂性:随着产品系列的增加,抽象工厂模式的类数量会增加,导致系统复杂度增加。
    2. 耦合性:抽象工厂模式中各个具体工厂类与具体产品类之间存在一定的耦合性,增加了系统的耦合度。
  • 示例

// 抽象产品接口:按钮
interface Button {void display();
}// 具体产品:Spring按钮
class SpringButton implements Button {@Overridepublic void display() {System.out.println("显示浅绿色按钮");}
}// 具体产品:Summer按钮
class SummerButton implements Button {@Overridepublic void display() {System.out.println("显示浅蓝色按钮");}
}// 抽象产品接口:文本框
interface TextField {void display();
}// 具体产品:Spring文本框
class SpringTextField implements TextField {@Overridepublic void display() {System.out.println("显示浅绿色文本框");}
}// 具体产品:Summer文本框
class SummerTextField implements TextField {@Overridepublic void display() {System.out.println("显示浅蓝色文本框");}
}// 抽象工厂接口
interface SkinFactory {Button createButton();TextField createTextField();
}// 具体工厂:Spring皮肤工厂
class SpringSkinFactory implements SkinFactory {@Overridepublic Button createButton() {return new SpringButton();}@Overridepublic TextField createTextField() {return new SpringTextField();}
}// 具体工厂:Summer皮肤工厂
class SummerSkinFactory implements SkinFactory {@Overridepublic Button createButton() {return new SummerButton();}@Overridepublic TextField createTextField() {return new SummerTextField();}
}// 客户端
public class Client {public static void main(String[] args) {// 创建Spring皮肤工厂SkinFactory springFactory = new SpringSkinFactory();// 创建Spring按钮Button springButton = springFactory.createButton();// 显示Spring按钮springButton.display();// 创建Spring文本框TextField springTextField = springFactory.createTextField();// 显示Spring文本框springTextField.display();// 创建Summer皮肤工厂SkinFactory summerFactory = new SummerSkinFactory();// 创建Summer按钮Button summerButton = summerFactory.createButton();// 显示Summer按钮summerButton.display();// 创建Summer文本框TextField summerTextField = summerFactory.createTextField();// 显示Summer文本框summerTextField.display();}
}
  • 输出结果
显示浅绿色按钮
显示浅绿色文本框
显示浅蓝色按钮
显示浅蓝色文本框

建造者模式

建造者模式是一种创建型设计模式,它将一个复杂对象的构建过程和其表示分离开来,从而可以使同样的构建过程可以创建不同的表示。建造者模式的关键是将构建过程分解成多个步骤,并提供一个指导者(Director)来组织这些步骤的执行,以构建出不同的对象表示。

  • 结构

    1. 产品(Product):表示被构建的复杂对象。产品类通常包含多个部件,如汽车对象可能包含引擎、车轮、座椅等部件。
    2. 抽象建造者(Builder):定义了构建产品各个部件的抽象方法,并提供了一个用于返回最终产品的方法。抽象建造者通常是一个接口或者抽象类。
    3. 具体建造者(Concrete Builder):实现了抽象建造者接口,负责构建产品的各个部件,并实现了返回最终产品的方法。
    4. 指导者(Director):负责组织构建过程,根据具体的构建者来指导构建过程的顺序和方法,最终构建出产品。
  • 场景

    1. 需要构建复杂对象:当需要构建复杂对象,且构建过程比较复杂时,可以使用建造者模式。
    2. 需要构建多个表示:当需要通过同样的构建过程创建不同的表示时,可以使用建造者模式。
  • 优点

    1. 分离构建过程和表示:建造者模式将构建过程和最终产品的表示分离开来,使得可以灵活地组合构建过程和表示。
    2. 复用性:建造者模式可以通过不同的建造者来创建不同的产品,提高了代码的复用性。
    3. 更好的封装性:建造者模式将产品的构建过程封装在具体建造者中,使得客户端无需了解产品的具体构建过程。
  • 缺点

    1. 增加了代码量:建造者模式引入了多个新的类,可能会增加系统的复杂性和代码量。
    2. 不适合构建较简单的对象:当产品对象较简单,且构建过程相对固定时,使用建造者模式可能会显得繁琐。
  • 示例

// 产品类 - 汽车
class Car {private String brand; // 品牌private String model; // 型号private String color; // 颜色public Car(String brand, String model, String color) {this.brand = brand;this.model = model;this.color = color;}public String getBrand() {return brand;}public String getModel() {return model;}public String getColor() {return color;}@Overridepublic String toString() {return "Car{" +"brand='" + brand + '\'' +", model='" + model + '\'' +", color='" + color + '\'' +'}';}
}// 抽象建造者接口
interface CarBuilder {void buildBrand(String brand); // 建造品牌void buildModel(String model); // 建造型号void buildColor(String color); // 建造颜色Car getResult(); // 获取结果
}// 具体建造者 - 奥迪汽车建造者
class AudiCarBuilder implements CarBuilder {private Car car;public AudiCarBuilder() {car = new Car("Audi", "", "");}@Overridepublic void buildBrand(String brand) {car = new Car("Audi", "", "");}@Overridepublic void buildModel(String model) {car = new Car(car.getBrand(), model, "");}@Overridepublic void buildColor(String color) {car = new Car(car.getBrand(), car.getModel(), color);}@Overridepublic Car getResult() {return car;}
}// 指导者 - 汽车销售员
class CarSalesman {private CarBuilder carBuilder;public void setCarBuilder(CarBuilder carBuilder) {this.carBuilder = carBuilder;}public Car constructCar() {carBuilder.buildBrand("Audi"); // 建造品牌carBuilder.buildModel("A4"); // 建造型号carBuilder.buildColor("Black"); // 建造颜色return carBuilder.getResult(); // 获取结果}
}public class BuilderPatternExample {public static void main(String[] args) {CarBuilder audiCarBuilder = new AudiCarBuilder();CarSalesman carSalesman = new CarSalesman();carSalesman.setCarBuilder(audiCarBuilder);Car car = carSalesman.constructCar();System.out.println(car);}
}
  • 输出结果
Car{brand='Audi', model='A4', color='Black'}

原型模式

原型模式(Prototype Pattern)是一种创建型设计模式,它用于创建对象的克隆,而不是通过实例化来创建新对象。原型模式通过复制现有对象来创建新对象,从而避免了耗时的实例化过程。

  • 结构

    1. 原型接口:定义了一个可以克隆自身的方法。
    2. 具体原型类:实现了原型接口,提供了克隆自身的方法。
    3. 客户端:通过调用具体原型类的克隆方法来获取新的对象。
  • 场景

    1. 对象初始化成本高:当对象的创建过程比较耗时或资源消耗较大时,可以使用原型模式提前创建好对象,然后通过复制来避免重复初始化。
    2. 对象类型不确定:当需要在运行时动态地创建对象,并且不清楚对象的具体类型时,可以使用原型模式。
    3. 复杂对象的复制:当对象包含了其他对象的引用,且需要进行深层次的拷贝时,可以使用原型模式来实现对象的复制。
    4. 保护对象的状态:当需要保护对象的状态不被外部修改时,可以通过克隆来获取对象的副本,从而保护原始对象的状态。
  • 优点

    1. 减少资源消耗:通过复制现有对象来创建新对象,避免了耗时的实例化过程,减少了资源消耗。
    2. 简化对象创建:可以在运行时动态地创建对象,而无需事先知道对象的类型。
    3. 灵活性:可以通过修改原型对象来创建不同类型的对象,或者通过克隆对象来创建多个相似对象。
  • 缺点

    1. 深拷贝问题:原型模式要求对象支持克隆操作,但如果对象中包含了其他对象的引用,克隆操作可能会导致深层次的拷贝问题。
    2. 复杂性:如果对象的复制过程比较复杂,可能会导致代码复杂度增加。
  • 示例

// 实现Cloneable接口,表示可以被克隆
class Shape implements Cloneable {private String type;public String getType() {return type;}public void setType(String type) {this.type = type;}// 重写Object类的clone方法,实现浅拷贝@Overridepublic Object clone() throws CloneNotSupportedException {return super.clone();}
}// 具体原型类:圆形
class Circle extends Shape {public Circle() {setType("圆形");}
}// 具体原型类:正方形
class Square extends Shape {public Square() {setType("正方形");}
}// 客户端
public class Client {public static void main(String[] args) {// 创建圆形对象Circle circle = new Circle();try {// 克隆圆形对象Circle clonedCircle = (Circle) circle.clone();System.out.println("原型对象:" + circle.getType());System.out.println("克隆对象:" + clonedCircle.getType());} catch (CloneNotSupportedException e) {e.printStackTrace();}// 创建正方形对象Square square = new Square();try {// 克隆正方形对象Square clonedSquare = (Square) square.clone();System.out.println("原型对象:" + square.getType());System.out.println("克隆对象:" + clonedSquare.getType());} catch (CloneNotSupportedException e) {e.printStackTrace();}}
}
  • 输出结果
原型对象:圆形
克隆对象:圆形
原型对象:正方形
克隆对象:正方形

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/829385.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Typora for Mac:轻量级Markdown编辑器

Typora for Mac是一款专为Mac用户设计的轻量级Markdown编辑器,它以其简洁的界面和强大的功能,成为了Markdown写作爱好者的首选工具。 Typora for Mac v1.8.10中文激活版下载 Typora的最大特色在于其所见即所得的编辑模式,用户无需关心复杂的M…

Flutter-如何序列化和反序列化为json对象

在Flutter中,使用json_serializable可以帮助你自动地序列化和反序列化JSON数据。这通常通过json_serialization库实现,它基于Dart的源代码生成功能。以下是如何在Flutter中使用json_serializable的步骤: 1.添加依赖: 首先&#…

为什么 Facebook 不使用 Git?

在编程的世界里,Git 就像水一样常见,以至于我们认为它是创建和管理代码更改的唯一可行的工具。 前 Facebook 员工,2024 年 首先,我为什么关心? 我致力于构建 Graphite,它从根本上受到 Facebook 内部工具的…

Java | Leetcode Java题解之第52题N皇后II

题目&#xff1a; 题解&#xff1a; class Solution {public int totalNQueens(int n) {Set<Integer> columns new HashSet<Integer>();Set<Integer> diagonals1 new HashSet<Integer>();Set<Integer> diagonals2 new HashSet<Integer>…

【Diffusion实战】训练一个diffusion模型生成蝴蝶图像(Pytorch代码详解)

上一篇Diffusion实战是确确实实一步一步走的公式&#xff0c;这回采用一个更方便的库&#xff1a;diffusers&#xff0c;来实现Diffusion模型训练。 Diffusion实战篇&#xff1a;   【Diffusion实战】训练一个diffusion模型生成S曲线&#xff08;Pytorch代码详解&#xff09;…

Rust的impl

impl 是 Rust 编程语言中的一个关键字&#xff0c;用于实现类型的行为&#xff0c;包括但不限于&#xff1a; 1. 方法定义&#xff1a; impl 关键字用于为结构体&#xff08;struct&#xff09;、枚举&#xff08;enum&#xff09;、联合体&#xff08;union&#xff09;、tra…

web题目实操 5(备份文件和关于MD5($pass,true)注入的学习)

1.[ACTF2020 新生赛]BackupFile &#xff08;1&#xff09;打开页面后根据提示是备份文件 &#xff08;2&#xff09;查看源码发现啥都没有 &#xff08;3&#xff09;这里啊直接用工具扫描&#xff0c;可以扫描到一个文件名为&#xff1a;/index.php.bak的文件 &#xff08;…

nginx + rtmp 搭建rtmp服务器

这里写自定义目录标题 1、nginx.conf 的配置文件如下 #user nobody; worker_processes 1;#error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;#pid logs/nginx.pid;events {worker_connections 1024; }http {includ…

C# 异步编程

异步编程是一种思路异步相当于对线程池的封装await相当于让另一个线程来干这个事 常见概念已经有多线程了&#xff0c;为何还要异步多线程与异步是不同的概念多线程与异步的适用场景不同*多线程**异步* 什么是异步任务(Task)包含了异步任务的各种状态的一个引用类型对于异步任务…

ArcGIS Pro 和 Python — 分析全球主要城市中心的土地覆盖变化

第一步——设置工作环境 1–0. 地理数据库 在下载任何数据之前,我将创建几个地理数据库,在其中保存和存储所有数据以及我将创建的后续图层。将为我要分析的五个城市中的每一个创建一个地理数据库,并将其命名为: “Phoenix.gdb” “Singapore.gdb” “Berlin.gdb” “B…

安卓悬浮窗权限检查

目录 悬浮窗权限代码检测悬浮窗功能 悬浮窗权限 请求了这个权限后&#xff0c;app的权限管理中会有「显示悬浮窗」的权限选项。后面会引导用户去开启这个权限。 <uses-permission android:name"android.permission.SYSTEM_ALERT_WINDOW" />代码检测悬浮窗功能…

Windows系统下将MySQL数据库表内的数据全量导入Elasticsearch

目录 下载安装Logstash 配置Logstash配置文件 运行配置文件 查看导入结果 使用Logstash将sql数据导入Elasticsearch 下载安装Logstash 官网地址 选择Windows系统&#xff0c;需下载与安装的Elasticsearch相同版本的&#xff0c;下载完成后解压安装包。 配置Logstash配…

贪吃蛇大作战【纯c语言】

如果有看到不懂的地方或者对c语言某些知识忘了的话&#xff0c;可以找我之前的文章哦&#xff01;&#xff01;&#xff01; 个人主页&#xff1a;小八哥向前冲~-CSDN博客 所属专栏&#xff1a;c语言_小八哥向前冲~的博客-CSDN博客 贪吃蛇游戏演示&#xff1a; 贪吃蛇游戏动画演…

第一阶段--Day2--信息安全法律法规、网络安全相关标准

目录 1. 针对信息安全的规定 2. 网络安全相关标准 1. 针对信息安全的规定 《中华人民共和国计算机信息系统安全保护条例》1994年2月18日颁布并实施 中华人民共和国计算机信息系统安全保护条例__增刊20111国务院公报_中国政府网 《中华人民共和国国际联网安全保护管理…

笔记:编写程序,分别采用面向对象和 pyplot 快捷函数的方式绘制正弦曲线 和余弦曲线。 提示:使用 sin()或 cos()函数生成正弦值或余弦值。

文章目录 前言一、面向对象和 pyplot 快捷函数的方式是什么&#xff1f;二、编写代码面向对象的方法&#xff1a;使用 pyplot 快捷函数的方法&#xff1a; 总结 前言 本文将探讨如何使用编程语言编写程序&#xff0c;通过两种不同的方法绘制正弦曲线和余弦曲线。我们将分别采用…

图像处理ASIC设计方法 笔记18 轮廓跟踪算法的硬件加速方案

目录 1排除伪孤立点(断裂链表)方法1 限制链表的长度方法2 增加判断条件排除断裂链表方法3 排除不必要跟踪的轮廓(推荐用这个方法)P129 轮廓跟踪算法的硬件加速方案 1排除伪孤立点(断裂链表) 如果图像中某区域存在相邻像素之间仅有对角连接的部位,则对包围该区域的像素…

SOLIDWORKS Electrical 3D--精准的三维布线

相信很多工程师在实际生产的时候都会遇到线材长度不准确的问题&#xff0c;从而导致线材浪费甚至整根线材报废的问题&#xff0c;这基本都是由于人工测量长度所导致的&#xff0c;因此本次和大家简单介绍一下SOLIDWORKS Electrical 3D布线的功能&#xff0c;Electrical 3D布线能…

伙伴匹配(后端)-- 用户登录

文章目录 登录逻辑设计登录业务代码实现用户登录态如何知道是哪个用户登录了&#xff1f;cookie与session 逻辑删除配置添加TableLogic注解 &#xff08;现在做单机登录&#xff09; 后面修改为redis单点登录 登录逻辑设计 接收参数&#xff1a;用户接账户&#xff0c;密码 请…

IDEA | 更方便地查看方法的调用链路,把控代码变更的影响范围

使用场景&#xff1a;分析修改某个方法的影响范围。 查看方法调用链时&#xff0c;发现 2 个好工具&#xff1a; IDEA 自带的 Hierarchy 视图&#xff0c;相比 Find Usages&#xff0c;可以全局性地展示调用关系&#xff0c;不需要一层一层地点击&#xff0c;也不容易遗漏&am…

001 springboot整合mybatis-plus 商品列表 购买商品 商品详情确认订单 订单详情去支付 支付返回流水(一种商品)

文章目录 AlipayConfigAliPayController.javaFlowController.javaOrdersController.javaProductController.javaUserController.javaFlow.javaOrders.javaProduct.javaUser.javaFlowMapper.javaOrdersMapper.javaProductMapper.javaUserMapper.javaAliPayServiceImpl.javaFlowS…