惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

W
WeLiveSecurity
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Hacker News - Newest:
Hacker News - Newest: "LLM"
Cloudbric
Cloudbric
V
Visual Studio Blog
L
LangChain Blog
A
About on SuperTechFans
B
Blog
T
Tenable Blog
罗磊的独立博客
Hacker News: Ask HN
Hacker News: Ask HN
Blog — PlanetScale
Blog — PlanetScale
博客园 - 三生石上(FineUI控件)
The Register - Security
The Register - Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
P
Palo Alto Networks Blog
U
Unit 42
WordPress大学
WordPress大学
D
Darknet – Hacking Tools, Hacker News & Cyber Security
N
News and Events Feed by Topic
T
Threat Research - Cisco Blogs
C
Check Point Blog
Security Latest
Security Latest
M
MIT News - Artificial intelligence
Application and Cybersecurity Blog
Application and Cybersecurity Blog
宝玉的分享
宝玉的分享
P
Proofpoint News Feed
NISL@THU
NISL@THU
Forbes - Security
Forbes - Security
S
Securelist
Security Archives - TechRepublic
Security Archives - TechRepublic
Hugging Face - Blog
Hugging Face - Blog
aimingoo的专栏
aimingoo的专栏
Latest news
Latest news
GbyAI
GbyAI
T
Troy Hunt's Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
L
LINUX DO - 热门话题
V2EX - 技术
V2EX - 技术
小众软件
小众软件
Google DeepMind News
Google DeepMind News
K
Kaspersky official blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
O
OpenAI News
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
N
Netflix TechBlog - Medium
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Google DeepMind News
Google DeepMind News
P
Proofpoint News Feed

博客园 - nuccch

在Cursor中读取飞书文档 使用GIMP去除水印的有效方法 如何基于VSCode打造Java开发环境 在IDEA中配置注释模板 在Windows中使用Linux系统 树形层级结构的数据库表设计方案 申请Let's Encrypt免费HTTPS证书的方法 为GIT仓库项目设置独立配置参数 DBeaver设置不断开连接 构建工具Gradle入门实践 如何在Maven中排除依赖传递 87键键盘的数字键对应快捷键含义 关于Java JSON库的选择 解决mybatis批量更新慢问题 解决Spring Cloud Gateway中使用CompletableFuture.supplyAsync()执行Feign调用报错 Spring Boot框架中在Controller方法里获取Request和Response对象的2种方式 解读Spring Boot框架中不同位置抛出异常的处理流程 探究Spring Boot框架中访问不存在的接口时触发对error路径的访问 Spring Cloud工程中使用Nacos配置中心的2种方式 Swagger开启账号验证访问
如何理解和认识设计模式
nuccch · 2026-02-27 · via 博客园 - nuccch

在Java开发中,一个比较流程的概念就是“设计模式”,特别是在一些基础框架中,更是充满了对各种设计模式的应用。

在应用软件开发行业从业了这么多年,也曾拜读过相关技术书籍,对于设计模式的名字也能娓娓道来,但是对于设计模式的理解,似乎一直以来都不深刻,换言之:只学到了设计模式的概念,并没有真正吃透设计模式存在的意义以及如何在项目中灵活运用。在过往的软件开发项目中,也层主动或被动地使用过一些常用的设计模式,但是并没有真正领悟到设计模式的所带来的好处,似乎是一种顺其自然的使用。

直到今天再次应用“责任链模式”解决支付网关的切换问题时,才从心底感受到设计模式所带来的益处。

结合这么多年的开发实践,说说我对设计模式的理解:简化代码结构,便于理解,维护和迭代,这是最直接的收益。

反之,如果不应用设计模式,那么编写出来的代码可能充斥着大量的if...else...结构,不利用项目演进过程中的迭代和扩展。

业务场景举例:
支付中心同时对接了原生支付宝支付和微信支付,还需要接入付呗支付(注:付呗支付本质上对接的也是支付宝和微信支付)。产品设计如下规则:原生支付宝存在收款限额,当超过设定的指定限额时直接切换使用付呗支付宝支付;另外,设定支付比例,比如:20%的请求使用原生支付宝和原生微信支付,80%的请求使用付呗支付宝和付呗微信支付;统计失败率,当原生支付宝/微信 或 付呗支付宝/微信的失败率超过某个阈值后自动切换成另一种支付渠道。

针对上述业务场景,如果不使用任何设计模式,编写出的代码结果可能是如下情况:

# 伪代码:硬编码的弊端
def pay(amount, pay_type):
    if pay_type == "alipay":
        # 先判断比例
        if random.random() < 0.2:
            # 再判断原生支付宝是否可用+是否超限额
            if 原生支付宝可用 and amount <= 限额:
                return 原生支付宝支付()
            else:
                # 切付呗支付宝
                if 付呗支付宝可用:
                    return 付呗支付宝支付()
                else:
                    return 支付失败
        else:
            # 80%走付呗
            if 付呗支付宝可用:
                return 付呗支付宝支付()
            else:
                # 降级到原生
                if 原生支付宝可用 and amount <= 限额:
                    return 原生支付宝支付()
                else:
                    return 支付失败
    # 微信同理,重复大量代码

这种实现的问题:耦合严重(改比例要动所有 if)、扩展性差(新增渠道要加大量 if)、维护难(规则嵌套层级深,定位问题繁琐)、无法动态熔断(失败率判断要嵌入每个分支)。

如果使用责任链模式能将这些判断逻辑完全拆分,让每个节点只做一件事,完美规避以上问题,这就是设计模式的价值所在。