一、为什么需要设计模式
在 Java 项目中,随着业务复杂度上升,常见问题包括:
if-else / switch急剧膨胀
Java 设计模式涵盖创建型、结构型及行为型三大类共 23 种模式。核心基于 SOLID 原则,如单一职责、开闭原则等。单例模式推荐枚举实现,工厂与策略模式用于解耦业务逻辑。代理、装饰器、适配器处理结构组合。Spring 框架广泛应用了这些模式,如 BeanFactory 使用工厂模式,AOP 使用代理模式。掌握设计模式有助于降低代码耦合度,提升系统可扩展性与可维护性,解决 if-else 膨胀及职责不清问题。

在 Java 项目中,随着业务复杂度上升,常见问题包括:
if-else / switch 急剧膨胀设计模式的本质不是语法技巧,而是'解耦变化'的经验总结。
一句话总结: 设计模式 = 封装变化 + 降低耦合 + 提高可扩展性
| 原则 | 含义 |
|---|---|
| SRP | 单一职责 |
| OCP | 对扩展开放,对修改关闭 |
| LSP | 里氏替换 |
| ISP | 接口隔离 |
| DIP | 依赖倒置 |
| 合成复用 | 少继承,多组合 |
设计模式 = SOLID 原则的具体实现形式
关注点:对象如何创建,如何解耦'创建'与'使用'
public class Singleton {
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;
}
}
关键点解析
volatile:防止指令重排public enum Singleton {
INSTANCE;
}
new 导致高耦合interface Payment {
void pay();
}
class AliPay implements Payment {
public void pay() {
System.out.println("支付宝支付");
}
}
class WeChatPay implements Payment {
public void pay() {
System.out.println("微信支付");
}
}
class PaymentFactory {
static Payment create(String type) {
switch (type) {
case "ALI": return new AliPay();
case "WX": return new WeChatPay();
default: throw new IllegalArgumentException();
}
}
}
switch 越来越大 → 应升级为策略 + 工厂interface DaoFactory {
UserDao createUserDao();
OrderDao createOrderDao();
}
User user = User.builder()
.id(1)
.name("Tom")
.age(18)
.email("[email protected]")
.build();
Lombok 的 @Builder 就是建造者模式
class Config implements Cloneable {
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
关注点:类或对象如何组合,如何解耦结构
Object proxy = Proxy.newProxyInstance(
clazz.getClassLoader(),
clazz.getInterfaces(),
(proxy, method, args) -> {
System.out.println("before");
Object result = method.invoke(target, args);
System.out.println("after");
return result;
}
);
Spring AOP = 动态代理
在不修改原类的情况下,增强功能
InputStream in = new BufferedInputStream(
new FileInputStream("a.txt")
);
IO 流体系 = 装饰器模式教科书
class Adapter implements Target {
private Adaptee adaptee;
public void request() {
adaptee.oldRequest();
}
}
// JdbcTemplate = Facade
String s = "abc"; // 字符串常量池
关注点:对象之间如何协作、职责如何分配
interface Strategy {
void execute();
}
Map<String, Strategy> strategyMap;
abstract class AbstractService {
public final void process() {
validate();
execute();
}
}
JdbcTemplateApplicationEventPublisher
场景
FilterChain
Iterator<E>
| Spring 组件 | 使用的设计模式 |
|---|---|
| BeanFactory | 工厂 |
| ApplicationContext | 单例 |
| AOP | 代理 |
| JdbcTemplate | 模板方法 |
| Event | 观察者 |
| HandlerMapping | 策略 |
| FilterChain | 责任链 |

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online