设计模式

1.工厂设计模式(设计模式-工厂模式(简单工厂、工厂方法、抽象工厂)简单工厂模式 简单工厂模式是指由一个工厂对象决定常见出哪一种产品类的实 - 掘金)

2.单例设计模式

3.代理设计模式(AOP)

AOP(Aspect-Oriented Programming,面向切面编程) 能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。

4.观察者模式(华为面试官:手写一个观察者模式面试官:观察者模式在面向对象的语言中很常见。前端手写一个观察者模式。文章先以易于理解版介绍 - 掘金)

观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。

观察者模式结构图

image-20250610114024125

在观察者模式中有如下角色:

  • Subject:抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。
  • ConcreteSubject:具体主题(具体被观察者),该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知。
  • Observer:抽象观察者,是观察者者的抽象类,它定义了一个更新接口,使得在得到主题更改通知时更新自己。
  • ConcrereObserver:具体观察者,实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态。

5.装饰者模式(JS设计模式之装饰者模式:优雅的给对象增添“魔法”装饰者模式(Decorator Pattern)是一种结构型设计模式, - 掘金)

装饰者模式可以动态地给对象添加一些额外的属性或行为。相比于使用继承,装饰者模式更加灵活。简单点儿说就是当我们需要修改原有的功能,但我们又不愿直接去修改原有的代码时,设计一个 Decorator 套在原有代码外面。其实在 JDK 中就有很多地方用到了装饰者模式,比如 InputStream家族,InputStream 类下有 FileInputStream (读取文件)、BufferedInputStream (增加缓存,使读取文件速度大大提升)等子类都在不修改InputStream 代码的情况下扩展了它的功能。

继承是在编译时(compile-time)静态地给一个类增加功能,而装饰者模式是在运行时(run-time)动态地给一个对象增加功能。

装饰者模式可以减少类的创建:

5.1通过继承

1
2
3
4
5
6
7
class Coffee {}                           // 纯咖啡
class CoffeeWithSugar extends Coffee {} // 咖啡+糖
class CoffeeWithMilk extends Coffee {} // 咖啡+牛奶
class CoffeeWithIce extends Coffee {} // 咖啡+冰块
class CoffeeWithSugarAndMilk extends Coffee {} // 咖啡+糖+牛奶
class CoffeeWithSugarAndIce extends Coffee {} // 咖啡+糖+冰块
// ... 其他组合(共需要 7 个子类)

问题
3 种功能需要 7 个子类;如果有 5 种功能,则需要 2^5 - 1 = 31 个子类!这就是“类爆炸”。

5.2通过装饰者模式实现

只需为每个功能定义一个装饰类,通过组合实现任意功能嵌套:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 核心组件
interface Coffee {}
class BasicCoffee implements Coffee {}

// 装饰基类
abstract class CoffeeDecorator implements Coffee {
protected Coffee decoratedCoffee;
public CoffeeDecorator(Coffee coffee) {
this.decoratedCoffee = coffee;
}
}

// 具体装饰类(每个功能一个类)
class SugarDecorator extends CoffeeDecorator {
public SugarDecorator(Coffee coffee) { super(coffee); }
// 添加糖的逻辑
}

class MilkDecorator extends CoffeeDecorator {
public MilkDecorator(Coffee coffee) { super(coffee); }
// 添加牛奶的逻辑
}

class IceDecorator extends CoffeeDecorator {
public IceDecorator(Coffee coffee) { super(coffee); }
// 添加冰块的逻辑
}

使用时动态组合

1
2
3
4
5
// 任意组合功能,无需预定义子类:
Coffee order1 = new SugarDecorator(new BasicCoffee()); // 咖啡+糖
Coffee order2 = new MilkDecorator(new SugarDecorator(new BasicCoffee())); // 咖啡+糖+牛奶
Coffee order3 = new IceDecorator(new MilkDecorator(new BasicCoffee())); // 咖啡+牛奶+冰块
// ... 其他组合直接嵌套即可

优势

  • 3 种功能只需 3 个装饰类(而非 7 个子类)。
  • 5 种功能只需 5 个装饰类(而非 31 个子类)。
  • 新增功能时(如加蜂蜜),只需加一个 HoneyDecorator,而不是为所有组合创建子类。

image-20250610142322610

6.策略模式(一文搞懂策略模式(优化策略模式完全消除if else)-CSDN博客

7.责任链模式(Java 实现责任链模式 + 策略模式:优雅处理多级请求的方式一、什么是责任链模式? 责任链模式(Chain of Re - 掘金

8.代理模式和装饰者模式的区别面试官问:代理模式和装饰者模式有啥区别_装饰者模式和代理模式的区别-CSDN博客)

高频面试点

示例代码

易错点

总结


设计模式
https://kyy-logs.github.io/2026/04/09/语言/java/设计模式/
作者
Yangyang Kong
发布于
2026年4月9日
许可协议