当前位置: 首页 > article >正文

Java 设计模式最佳实践:构建可维护的应用

Java 设计模式最佳实践构建可维护的应用别叫我大神叫我 Alex 就好。一、引言大家好我是 Alex。设计模式是软件开发中解决常见问题的可重用方案。它们是经过验证的最佳实践可以帮助我们构建更可维护、更可扩展的应用。今天我想和大家分享一下 Java 中常用的设计模式及其最佳实践帮助大家更好地应用这些模式。二、设计模式概述设计模式分为三大类创建型模式负责对象的创建包括单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式结构型模式负责对象的组合包括适配器模式、桥接模式、装饰器模式、组合模式、外观模式、享元模式、代理模式行为型模式负责对象的行为包括策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式三、创建型模式1. 单例模式用途确保一个类只有一个实例并提供一个全局访问点实现方式饿汉式类加载时创建实例懒汉式首次使用时创建实例双重检查锁定避免线程安全问题静态内部类利用类加载机制保证线程安全枚举最简洁、最安全的实现方式示例// 枚举实现推荐 enum Singleton { INSTANCE; public void doSomething() { System.out.println(Singleton is doing something); } } // 使用 Singleton.INSTANCE.doSomething(); // 静态内部类实现 public class Singleton { private Singleton() {} private static class SingletonHolder { private static final Singleton INSTANCE new Singleton(); } public static Singleton getInstance() { return SingletonHolder.INSTANCE; } }2. 工厂模式用途创建对象时不暴露创建逻辑而是使用共同的接口来指向新创建的对象实现方式简单工厂一个工厂类负责创建所有产品工厂方法每个产品有对应的工厂类抽象工厂创建相关或依赖对象的家族示例// 产品接口 interface Product { void use(); } // 具体产品 class ConcreteProductA implements Product { Override public void use() { System.out.println(Using Product A); } } class ConcreteProductB implements Product { Override public void use() { System.out.println(Using Product B); } } // 工厂接口 interface Factory { Product createProduct(); } // 具体工厂 class ConcreteFactoryA implements Factory { Override public Product createProduct() { return new ConcreteProductA(); } } class ConcreteFactoryB implements Factory { Override public Product createProduct() { return new ConcreteProductB(); } } // 使用 Factory factory new ConcreteFactoryA(); Product product factory.createProduct(); product.use();3. 建造者模式用途将复杂对象的构建过程与表示分离使得同样的构建过程可以创建不同的表示实现方式产品类需要构建的复杂对象建造者接口定义构建产品的方法具体建造者实现建造者接口指挥者负责使用建造者构建产品示例// 产品类 class Product { private String partA; private String partB; private String partC; public void setPartA(String partA) { this.partA partA; } public void setPartB(String partB) { this.partB partB; } public void setPartC(String partC) { this.partC partC; } Override public String toString() { return Product{ partA partA \ , partB partB \ , partC partC \ }; } } // 建造者接口 interface Builder { void buildPartA(); void buildPartB(); void buildPartC(); Product getResult(); } // 具体建造者 class ConcreteBuilder implements Builder { private Product product new Product(); Override public void buildPartA() { product.setPartA(Part A); } Override public void buildPartB() { product.setPartB(Part B); } Override public void buildPartC() { product.setPartC(Part C); } Override public Product getResult() { return product; } } // 指挥者 class Director { public Product construct(Builder builder) { builder.buildPartA(); builder.buildPartB(); builder.buildPartC(); return builder.getResult(); } } // 使用 Director director new Director(); Builder builder new ConcreteBuilder(); Product product director.construct(builder); System.out.println(product);四、结构型模式1. 适配器模式用途将一个类的接口转换成客户端期望的另一个接口使得原本不兼容的类可以一起工作实现方式类适配器通过继承实现对象适配器通过组合实现示例// 目标接口 interface Target { void request(); } // 适配者类 class Adaptee { public void specificRequest() { System.out.println(Adaptees specific request); } } // 类适配器 class ClassAdapter extends Adaptee implements Target { Override public void request() { specificRequest(); } } // 对象适配器 class ObjectAdapter implements Target { private Adaptee adaptee; public ObjectAdapter(Adaptee adaptee) { this.adaptee adaptee; } Override public void request() { adaptee.specificRequest(); } } // 使用 Target target1 new ClassAdapter(); target1.request(); Target target2 new ObjectAdapter(new Adaptee()); target2.request();2. 装饰器模式用途动态地给对象添加额外的责任增强对象的功能实现方式组件接口定义对象的接口具体组件实现组件接口装饰器实现组件接口并包含组件的引用具体装饰器实现具体的装饰功能示例// 组件接口 interface Component { void operation(); } // 具体组件 class ConcreteComponent implements Component { Override public void operation() { System.out.println(ConcreteComponents operation); } } // 装饰器 abstract class Decorator implements Component { protected Component component; public Decorator(Component component) { this.component component; } Override public void operation() { component.operation(); } } // 具体装饰器 class ConcreteDecoratorA extends Decorator { public ConcreteDecoratorA(Component component) { super(component); } Override public void operation() { super.operation(); addBehavior(); } private void addBehavior() { System.out.println(ConcreteDecoratorAs additional behavior); } } class ConcreteDecoratorB extends Decorator { public ConcreteDecoratorB(Component component) { super(component); } Override public void operation() { super.operation(); addBehavior(); } private void addBehavior() { System.out.println(ConcreteDecoratorBs additional behavior); } } // 使用 Component component new ConcreteComponent(); Component decoratedComponent new ConcreteDecoratorB(new ConcreteDecoratorA(component)); decoratedComponent.operation();3. 代理模式用途为其他对象提供一个代理以控制对这个对象的访问实现方式静态代理手动创建代理类动态代理运行时生成代理类如 JDK 动态代理、CGLIB示例// 接口 interface Subject { void request(); } // 真实主题 class RealSubject implements Subject { Override public void request() { System.out.println(RealSubjects request); } } // 静态代理 class StaticProxy implements Subject { private RealSubject realSubject; public StaticProxy(RealSubject realSubject) { this.realSubject realSubject; } Override public void request() { System.out.println(Before request); realSubject.request(); System.out.println(After request); } } // 使用 Subject subject new StaticProxy(new RealSubject()); subject.request(); // JDK 动态代理 import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; class DynamicProxy implements InvocationHandler { private Object target; public DynamicProxy(Object target) { this.target target; } Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println(Before invocation); Object result method.invoke(target, args); System.out.println(After invocation); return result; } } // 使用 Subject realSubject new RealSubject(); Subject proxySubject (Subject) Proxy.newProxyInstance( realSubject.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), new DynamicProxy(realSubject) ); proxySubject.request();五、行为型模式1. 策略模式用途定义一系列算法将每个算法封装起来并使它们可以互相替换实现方式策略接口定义算法的接口具体策略实现策略接口上下文使用策略的类示例// 策略接口 interface Strategy { int doOperation(int num1, int num2); } // 具体策略 class AddStrategy implements Strategy { Override public int doOperation(int num1, int num2) { return num1 num2; } } class SubtractStrategy implements Strategy { Override public int doOperation(int num1, int num2) { return num1 - num2; } } class MultiplyStrategy implements Strategy { Override public int doOperation(int num1, int num2) { return num1 * num2; } } // 上下文 class Context { private Strategy strategy; public Context(Strategy strategy) { this.strategy strategy; } public int executeStrategy(int num1, int num2) { return strategy.doOperation(num1, num2); } } // 使用 Context context new Context(new AddStrategy()); System.out.println(10 5 context.executeStrategy(10, 5)); context new Context(new SubtractStrategy()); System.out.println(10 - 5 context.executeStrategy(10, 5)); context new Context(new MultiplyStrategy()); System.out.println(10 * 5 context.executeStrategy(10, 5));2. 观察者模式用途定义对象间的一种一对多依赖关系当一个对象的状态发生变化时所有依赖于它的对象都得到通知并被自动更新实现方式主题维护观察者列表提供添加和删除观察者的方法观察者定义更新接口具体主题实现主题接口维护状态具体观察者实现观察者接口响应主题的通知示例// 观察者接口 interface Observer { void update(); } // 主题接口 interface Subject { void registerObserver(Observer observer); void removeObserver(Observer observer); void notifyObservers(); } // 具体主题 class ConcreteSubject implements Subject { private ListObserver observers new ArrayList(); private int state; public int getState() { return state; } public void setState(int state) { this.state state; notifyObservers(); } Override public void registerObserver(Observer observer) { observers.add(observer); } Override public void removeObserver(Observer observer) { observers.remove(observer); } Override public void notifyObservers() { for (Observer observer : observers) { observer.update(); } } } // 具体观察者 class ConcreteObserver implements Observer { private ConcreteSubject subject; private int observerState; public ConcreteObserver(ConcreteSubject subject) { this.subject subject; subject.registerObserver(this); } Override public void update() { observerState subject.getState(); System.out.println(Observer state updated: observerState); } } // 使用 ConcreteSubject subject new ConcreteSubject(); ConcreteObserver observer1 new ConcreteObserver(subject); ConcreteObserver observer2 new ConcreteObserver(subject); subject.setState(10); subject.setState(20);3. 责任链模式用途将请求的发送者和接收者解耦使多个对象都有机会处理请求实现方式处理器接口定义处理请求的方法具体处理器实现处理器接口处理请求或传递给下一个处理器客户端创建处理器链并发送请求示例// 处理器接口 interface Handler { void setNext(Handler next); void handleRequest(int request); } // 具体处理器 class ConcreteHandler1 implements Handler { private Handler next; Override public void setNext(Handler next) { this.next next; } Override public void handleRequest(int request) { if (request 0 request 10) { System.out.println(ConcreteHandler1 handled request: request); } else if (next ! null) { next.handleRequest(request); } } } class ConcreteHandler2 implements Handler { private Handler next; Override public void setNext(Handler next) { this.next next; } Override public void handleRequest(int request) { if (request 10 request 20) { System.out.println(ConcreteHandler2 handled request: request); } else if (next ! null) { next.handleRequest(request); } } } class ConcreteHandler3 implements Handler { private Handler next; Override public void setNext(Handler next) { this.next next; } Override public void handleRequest(int request) { if (request 20 request 30) { System.out.println(ConcreteHandler3 handled request: request); } else if (next ! null) { next.handleRequest(request); } } } // 使用 Handler handler1 new ConcreteHandler1(); Handler handler2 new ConcreteHandler2(); Handler handler3 new ConcreteHandler3(); handler1.setNext(handler2); handler2.setNext(handler3); // 发送请求 handler1.handleRequest(5); handler1.handleRequest(15); handler1.handleRequest(25); handler1.handleRequest(35);六、设计模式最佳实践1. 选择合适的设计模式根据问题选择根据具体的问题场景选择合适的设计模式理解模式的意图深入理解设计模式的意图和适用场景避免过度设计不要为了使用设计模式而使用设计模式2. 实现设计模式遵循设计原则遵循 SOLID 原则保持简单尽量保持设计模式的实现简洁明了考虑性能在实现设计模式时考虑性能影响3. 测试设计模式单元测试测试设计模式的各个组件集成测试测试设计模式在系统中的集成性能测试测试设计模式的性能影响七、实战案例案例电商系统中的设计模式需求构建一个电商系统支持产品管理、订单管理、支付等功能设计模式应用单例模式用于系统配置、数据库连接池等工厂模式用于创建不同类型的产品建造者模式用于构建复杂的订单对象适配器模式用于集成不同的支付系统装饰器模式用于添加产品的附加功能策略模式用于实现不同的支付策略观察者模式用于订单状态变化的通知责任链模式用于处理订单的审批流程实现// 单例模式系统配置 public class SystemConfig { private static class ConfigHolder { private static final SystemConfig INSTANCE new SystemConfig(); } private SystemConfig() {} public static SystemConfig getInstance() { return ConfigHolder.INSTANCE; } // 配置方法 public String getConfig(String key) { // 实现配置获取 return config value; } } // 工厂模式产品工厂 interface ProductFactory { Product createProduct(); } class ElectronicProductFactory implements ProductFactory { Override public Product createProduct() { return new ElectronicProduct(); } } class ClothingProductFactory implements ProductFactory { Override public Product createProduct() { return new ClothingProduct(); } } // 建造者模式订单建造者 class OrderBuilder { private Order order new Order(); public OrderBuilder withId(long id) { order.setId(id); return this; } public OrderBuilder withCustomer(Customer customer) { order.setCustomer(customer); return this; } public OrderBuilder withProducts(ListProduct products) { order.setProducts(products); return this; } public Order build() { return order; } } // 策略模式支付策略 interface PaymentStrategy { void pay(double amount); } class CreditCardPaymentStrategy implements PaymentStrategy { Override public void pay(double amount) { System.out.println(Paying amount using credit card); } } class PayPalPaymentStrategy implements PaymentStrategy { Override public void pay(double amount) { System.out.println(Paying amount using PayPal); } } // 观察者模式订单状态观察者 interface OrderObserver { void update(Order order); } class EmailNotificationObserver implements OrderObserver { Override public void update(Order order) { System.out.println(Sending email notification for order order.getId()); } } class SMSNotificationObserver implements OrderObserver { Override public void update(Order order) { System.out.println(Sending SMS notification for order order.getId()); } }结果系统设计清晰易于维护和扩展各个组件职责明确耦合度低系统具有良好的可测试性八、总结设计模式是软件开发中的重要工具它们可以帮助我们构建更可维护、更可扩展的应用。通过合理地应用设计模式我们可以提高代码的质量和可读性减少重复代码提高开发效率。这其实可以更优雅一点。希望这篇文章能帮助大家更好地理解和应用 Java 设计模式。如果你有任何问题欢迎在评论区留言。关于作者我是 Alex一个在 CSDN 写 Java 架构思考的暖男。喜欢手冲咖啡养了一只叫Java的拉布拉多。如果我的文章对你有帮助欢迎关注我一起探讨 Java 技术的优雅之道。

相关文章:

Java 设计模式最佳实践:构建可维护的应用

Java 设计模式最佳实践:构建可维护的应用别叫我大神,叫我 Alex 就好。一、引言 大家好,我是 Alex。设计模式是软件开发中解决常见问题的可重用方案。它们是经过验证的最佳实践,可以帮助我们构建更可维护、更可扩展的应用。今天&am…...

被忽视的性能金矿:如何释放笔记本90%隐藏算力

被忽视的性能金矿:如何释放笔记本90%隐藏算力 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, Scar, and …...

高效处理视频字幕:MKV批量处理开源工具完全指南

高效处理视频字幕:MKV批量处理开源工具完全指南 【免费下载链接】mkvtoolnix-batch-tool Batch video and subtitle processing program with the ability to add, remove, or extract subtitles from all video files in a directory and its sub-directories. 项…...

告别理论推导!用《有源滤波器的快速实用设计》手把手搞定1kHz带通滤波器(附Multisim仿真)

1kHz带通滤波器实战指南:从查表到仿真的全流程解析 在电子设计竞赛或音频信号处理项目中,带通滤波器是高频出现的核心模块。许多工程师都曾陷入这样的困境:明明掌握了滤波器原理,面对"设计一个中心频率1kHz、带宽200Hz的带通…...

STM32定时器级联功能实战:如何构建64位定时器

1. 为什么需要64位定时器? 在嵌入式开发中,32位定时器对于大多数应用场景已经足够用了。比如一个72MHz的STM32,32位定时器最大能计时的时长大约是59.6秒(2^32/72MHz)。但在一些特殊场景下,比如需要记录设备…...

PicoCTF - 2020 Mini-Competition - Web Gauntlet(关卡1)

博主开始学习CTF并做记录,本人是一名初级渗透测试工程师,水平初级很一般。阅读书籍为异步图书的《CTF快速上手 PicoCTF真题解析》Web篇 ,李华峰著书这是第一本简单解析一下真题:Web Gauntlet(关卡)该题说明…...

深刻理解智能指针特性

文章目录RAII思想unique_ptr 独占型shared_ptr 共享型weak_ptr 弱引用型总结RAII思想 RAII:资源获取即初始化—>把资源的生命周期绑定到栈上对象的生命周期,栈上对象离开作用域就自动销毁了 对象构造,拿到资源对象析构,释放资…...

2024年流浪星球比赛

2024年暑假,我去到河北参加流浪星球比赛现场人很多,调试的人排队很长,不过调试很快60分钟的时间13分钟就弄完了。拿了国一比完赛后,我又去北京爬长城,长城的确难爬,道路已有些坑坑洼洼很多人不讲文明在墙上…...

212_视觉处理的基石:深入浅出卷积层(Convolutional Layer)

在处理图像时,传统的全连接网络(MLP)会将图像展平,这会丢失空间位置信息。卷积层则不同,它像一个“放大镜”在图像上滑动,提取局部特征。1. 为什么图像需要卷积?平移不变性:不管猫在…...

Zabbix监控Docker化部署避坑指南:从镜像版本选择到安全加固的完整配置

Zabbix监控Docker化部署避坑指南:从镜像版本选择到安全加固的完整配置 在容器化技术席卷运维领域的今天,将Zabbix监控系统部署在Docker环境中已成为主流选择。但看似简单的docker-compose up -d背后,隐藏着无数可能让运维工程师深夜加班的&qu…...

终极Windows 11优化指南:如何用Win11Debloat一键清理系统臃肿

终极Windows 11优化指南:如何用Win11Debloat一键清理系统臃肿 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter…...

ModTheSpire技术深度解析:Java字节码注入与游戏模组加载器架构剖析

ModTheSpire技术深度解析:Java字节码注入与游戏模组加载器架构剖析 【免费下载链接】ModTheSpire External mod loader for Slay The Spire 项目地址: https://gitcode.com/gh_mirrors/mo/ModTheSpire ModTheSpire作为《杀戮尖塔》游戏社区的核心技术基础设施…...

【深度解析】二维半导体晶体管:突破摩尔定律的下一代集成电路核心

1. 二维半导体晶体管的崛起:摩尔定律的终结者? 当硅基芯片的制程工艺逼近1纳米物理极限时,整个集成电路行业都在寻找"后硅时代"的突破口。我第一次在实验室见到二硫化钼(MoS2)晶体管时,那片厚度不…...

涨薪技术|Prometheus中配置Alertmanager

在上面的部分中已经简单介绍过,在Alertmanager中通过路由(Route)来定义告警的处理方式。路由是一个基于标签匹配的树状匹配结构。根据接收到告警的标签匹配相应的处理方式。这里将详细介绍路由相关的内容。 Alertmanager主要负责对Prometheus产生的告警进行统一处理,因此在A…...

什么是redis数据库?要会哪些基础知识

Redis(Remote Dictionary Server)是一个开源的内存数据结构存储系统,可用作数据库、缓存、消息中间件和实时分析引擎。它支持丰富的数据结构(如字符串、哈希、列表、集合、有序集合等),并提供高可用性、持久化、集群扩展等功能,常用于解决高并发、低延迟场景下的数据存储问…...

CATIA二次开发(CAA)实战:深度解析CATIDescendants在几何图形集遍历与筛选中的应用

1. CATIDescendants接口:几何图形集的"智能导航仪" 在CATIA二次开发中,处理几何图形集就像在迷宫中寻找特定房间。CATIDescendants接口就是你的智能导航仪,它能帮你快速定位目标。这个接口最常用的两个方法是GetAllChildren和GetDi…...

OpenClaw模型微调指南:用Qwen3.5-9B-AWQ-4bit优化专业领域识别

OpenClaw模型微调指南:用Qwen3.5-9B-AWQ-4bit优化专业领域识别 1. 为什么需要专业领域的模型微调 上周我在处理一批医疗影像报告时,发现OpenClaw默认的Qwen3.5模型对专业术语的识别准确率只有60%左右。当遇到"冠状动脉CTA"这样的专业描述时&…...

Win11Debloat:轻松打造极速、纯净Windows 11的终极指南

Win11Debloat:轻松打造极速、纯净Windows 11的终极指南 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and c…...

从LevelDB到自研PoolEngine:金融C++内存池测试演进史(2003–2024,12次重大架构迭代中的3次致命教训)

第一章:从LevelDB到自研PoolEngine:金融C内存池测试演进史(2003–2024,12次重大架构迭代中的3次致命教训)在高频交易系统与实时风控引擎的严苛场景下,内存分配延迟的微秒级波动即可能引发订单错配或熔断失效…...

告别知识管理焦虑!Karpathy 极简第二大脑实战指南(非常干货),帮你打造顶级思维外挂,建议收藏!

引言:知识管理的陷阱 你有没有这样的经历? • 收藏了 500 篇文章,却从来没看过第二遍• 买了 Notion/Obsidian 会员,花了两周搭建系统,三天后就放弃• 笔记越记越多,找的时候永远想不起来放在哪个文件夹•…...

EvoSkills:自进化的skill,是好skill

核心挑战 EvoSkills团队识别出技能生成的两大核心难题: 单次生成不可靠:多文件技能包结构复杂,一次性生成容易产生逻辑错误反馈信号稀疏:真实环境中缺乏ground-truth监督信号 双组件协同架构 EvoSkills框架概览 EvoSkills设计…...

实战演练:用快马平台生成含“陷阱”的ensp企业网攻防实验环境

作为一名经常需要搭建网络实验环境的技术爱好者,最近发现用InsCode(快马)平台来生成ensp项目特别高效。今天想分享一个实战案例:如何快速构建带"陷阱"的企业网攻防演练环境。 项目设计思路 这个实验环境模拟了典型的三层企业网络架构。最外层是…...

2026年4月OpenClaw怎么部署?腾讯云零门槛流程:含安装及大模型API、Skill配置

2026年4月OpenClaw怎么部署?腾讯云零门槛流程:含安装及大模型API、Skill配置。OpenClaw(原Clawdbot)作为2026年主流的AI自动化助理平台,可通过阿里云轻量服务器实现724小时稳定运行,并快速接入钉钉&#xf…...

Z-Image-Turbo-辉夜巫女真实生成效果:支持中文提示词直输,无需英文翻译

Z-Image-Turbo-辉夜巫女真实生成效果:支持中文提示词直输,无需英文翻译 1. 模型简介 Z-Image-Turbo-辉夜巫女是基于Z-Image-Turbo模型的Lora版本,专门针对生成"辉夜巫女"风格图片进行了优化。这个模型最大的特点是支持直接输入中…...

ble sig mesh消息格式分析

蓝牙 Mesh (Bluetooth SIG Mesh) 的数据格式采用分层结构,每一层都有其特定的数据单元和职责 一.承载层 (Bearer Layer) 承载层定义了消息如何在物理媒介上传输。蓝牙 Mesh 主要支持两种承载方式: 广播承载 (Advertising Bearer): 使用 BLE 广播包来传输…...

RMSNorm:深度学习归一化技术的革新与实践

1. 从LayerNorm到RMSNorm:归一化技术的进化之路 第一次在Transformer模型里看到RMSNorm这个名词时,我正对着训练日志里暴涨的GPU内存使用率发愁。作为LayerNorm的"轻量版"替代品,RMSNorm用一行数学公式就解决了困扰我多时的显存问题…...

基于STM32LXXX的数字电位器(DS3502U+TR)驱动应用程序设计

一、简介: DS3502 是 Maxim Integrated(现为 ADI 旗下)推出的一款高压、非易失数字电位器。 二、主要技术特性: 参数 规格 抽头数 128 个(7 位分辨率) 端到端电阻 10kΩ 电阻精度 20% 接口类型 IC(标准/快速模式,最高 400kHz) 数字工作电压 2.5V ~ 5.5V 模拟工作电压…...

Word以后一个空白页删除方法

https://cloud.tencent.com/developer/news/492607 参考上面的方法,点击显示编辑标记(下图右下角的那个),让分页符显示出来,然后直接delete就好了,然后再点击选择隐藏编辑标记即可。 如果在这个过程中导致…...

UE5 碰撞体组件与导航网格结果存在偏移的问题

问题是在大量使用球形collision发现的,最初以为是偏离但是方形的collision是正确的胶囊体的Collision也是有偏移的然后经过一系列的尝试,最终发觉如下现象。在对胶囊体做测试时,我并不需要一个坐标000的躺着的胶囊体,我为它设置了…...

aliyun---MySql云数据库

在阿里云的云数据库(RDS MySQL)中,内网 IP 和 外网 IP 的区别主要体现在性能、安全性和通信链路上。你可以把 RDS 想象成写字楼里的“保险柜”,内网是“楼内通道”,外网是“临街大门”。 1. 核心对比 特性内网 IP (VP…...