欢迎光临
我们一直在努力

软考高级系统架构师之设计模式篇

设计模式是软件设计中常见问题的典型解决方案,可以理解为编程界的“武功秘籍”。GoF(四人组)提出的23种设计模式,按目的可分为三大类:

  • 创建型模式(5种) :解决“对象怎么创建”的问题,将对象的创建与使用分离。
  • 结构型模式(7种) :解决“类或对象如何组成更大结构”的问题。
  • 行为型模式(11种) :解决“对象之间如何交互、职责如何分配”的问题。

系统架构师学习平台(点击这里进入)

一、创建型模式(5种)

1. 单例模式(Singleton)

通俗理解:一个类全局只有一个实例,像餐厅里只有一个消毒柜,所有人共用。

Spring Boot应用:Spring容器中的Bean默认就是单例的,整个应用上下文共享同一个实例。

@Service // 默认单例,全局只有一个实例
public class UserService {
public void doSomething() { ... }
}

2. 工厂模式(Factory Method)

通俗理解:把对象的创建交给“工厂”统一管理,像奶茶店根据订单生产不同口味的饮品,你不用管原料怎么来。

Spring Boot应用:BeanFactory和ApplicationContext就是典型的工厂,负责创建和管理Bean。

@Autowired
private ApplicationContext context;

public void test() {
// 工厂根据类型创建Bean
UserService service = context.getBean(UserService.class);
}

3. 抽象工厂模式(Abstract Factory)

通俗理解:工厂的工厂——当你要生产“整套产品”(比如一套北欧风家具:沙发+桌子+椅子),用一个工厂族来统一生产。

Spring Boot应用:Spring的@Configuration类可以看作抽象工厂,通过@Bean方法生产一系列相关对象。

@Configuration
public class AppConfig {
@Bean
public DataSource dataSource() { ... }

@Bean
public JdbcTemplate jdbcTemplate(DataSource ds) {
return new JdbcTemplate(ds);
}
}

4. 建造者模式(Builder)

通俗理解:像组装电脑——你可以一步步选择CPU、内存、硬盘,最后得到一台定制好的电脑,而不是一次性把所有参数塞进构造函数。

Spring Boot应用:RestTemplateBuilder、SecurityBuilder等,通过链式调用一步步构建复杂对象。

RestTemplate restTemplate = new RestTemplateBuilder()
.setConnectTimeout(Duration.ofSeconds(5))
.setReadTimeout(Duration.ofSeconds(10))
.build();

5. 原型模式(Prototype)

通俗理解:像复印机——有了一个原型文档,直接复印出副本,不用重新写一遍。

Spring Boot应用:将Bean的作用域设为prototype,每次获取都创建一个新实例。

@Scope("prototype") // 每次获取都创建新实例
@Component
public class PrototypeBean { ... }


二、结构型模式(7种)

6. 适配器模式(Adapter)

通俗理解:像手机转接头,把USB-C转成Lightning,让不兼容的接口能一起工作。

Spring Boot应用:HandlerAdapter将不同类型的Controller(@Controller、HttpRequestHandler等)适配成统一的处理接口。

// Spring MVC中,不同的Controller被适配成统一的处理方式
public class RequestMappingHandlerAdapter implements HandlerAdapter {
// 将@Controller方法适配成标准处理器
}

7. 代理模式(Proxy)

通俗理解:像明星的经纪人——你要找明星演出,得先经过经纪人,经纪人可以在中间加各种“增强”操作(签合同、收钱)。

Spring Boot应用:AOP(面向切面编程)就是通过代理模式实现的,在方法执行前后增强行为。

@Aspect
@Component
public class LogAspect {
@Around("execution(* com.example.service.*.*(..))")
public Object log(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("方法执行前记录日志…");
Object result = pjp.proceed(); // 调用原方法
System.out.println("方法执行后记录日志…");
return result;
}
}

8. 装饰器模式(Decorator)

通俗理解:像给蛋糕加料——先有一个基础蛋糕,然后一层层加上奶油、水果、巧克力,每加一层都是“装饰”,但最终还是个蛋糕。

Spring Boot应用:Spring的HttpServletRequestWrapper可以对请求进行装饰增强;Spring Cloud的Feign客户端也可以通过装饰添加熔断、重试等功能。

9. 外观模式(Facade)

通俗理解:像餐厅的“服务员”——你不需要知道后厨怎么运作,只需要告诉服务员要点什么菜,他帮你搞定一切。

Spring Boot应用:JdbcTemplate就是外观模式,它封装了获取连接、处理异常、释放资源等复杂操作,开发者只需写SQL。

// 开发者只需要关心SQL,其他复杂操作都被JdbcTemplate封装了
jdbcTemplate.query("SELECT * FROM users", (rs, rowNum) ->
new User(rs.getString("name"))
);

10. 桥接模式(Bridge)

通俗理解:像遥控器和电视——遥控器(抽象)和电视(实现)可以独立变化,换遥控器不影响电视,换电视也不影响遥控器。

Spring Boot应用:Spring的PlatformTransactionManager接口有多个实现(DataSourceTransactionManager、JpaTransactionManager等),将事务管理与具体数据源实现解耦。

11. 组合模式(Composite)

通俗理解:像文件夹和文件——文件夹里可以放文件,也可以放子文件夹,你可以把整个目录结构当作一个整体来操作。

Spring Boot应用:Spring的CompositeCacheManager可以组合多个缓存管理器,对外表现为一个统一的缓存管理接口。

12. 享元模式(Flyweight)

通俗理解:像图书馆的书——很多人借同一本书,但书只有一本,大家共享,不需要每人买一本。

Spring Boot应用:Spring容器中的单例Bean本质上就是享元模式——多个地方注入同一个Bean,共享同一个实例,节省内存。


三、行为型模式(11种)

13. 模板方法模式(Template Method)

通俗理解:像做菜的固定流程——都是“热锅→倒油→炒菜→出锅”,但具体炒什么菜由你决定。

Spring Boot应用:JdbcTemplate定义了数据库操作的固定流程(获取连接、执行SQL、处理结果、释放资源),开发者只需实现具体的SQL和结果映射。

// JdbcTemplate定义了模板流程,开发者只需提供SQL和映射逻辑
jdbcTemplate.query("SELECT * FROM emp", (rs, rowNum) ->
new Employee(rs.getInt("id"), rs.getString("name"))
);

14. 策略模式(Strategy)

通俗理解:像出行方式——去同一个地方,可以坐公交、打车、骑自行车,算法不同但结果一样,你可以随时切换。

Spring Boot应用:通过Map注入或@Qualifier实现策略的动态选择。

// 定义策略接口
public interface PaymentStrategy {
void pay(int amount);
}

// 多个策略实现
@Component("alipay")
public class AlipayStrategy implements PaymentStrategy { ... }

@Component("wechat")
public class WechatStrategy implements PaymentStrategy { ... }

// 使用时动态选择
@Autowired
private Map<String, PaymentStrategy> strategies;

public void pay(String type, int amount) {
strategies.get(type).pay(amount);
}

15. 观察者模式(Observer)

通俗理解:像微信群通知——群主发一条消息,所有群成员自动收到。

Spring Boot应用:Spring的事件监听机制就是观察者模式。

// 定义事件
public class OrderEvent extends ApplicationEvent {
public OrderEvent(Object source) { super(source); }
}

// 监听事件
@Component
public class OrderListener implements ApplicationListener<OrderEvent> {
@Override
public void onApplicationEvent(OrderEvent event) {
System.out.println("收到订单事件,发送通知…");
}
}

// 发布事件
applicationContext.publishEvent(new OrderEvent("订单创建"));

16. 责任链模式(Chain of Responsibility)

通俗理解:像公司审批流程——请假1天组长批,3天经理批,7天老板批,请求沿着链条传递,直到有人处理。

Spring Boot应用:Spring Security的过滤器链就是责任链模式;也可以用来处理订单流程。

// 定义处理器接口
public interface OrderHandler {
void setNext(OrderHandler next);
void handle(Order order);
}

// 多个处理器组成链:校验→扣库存→生成订单→发送通知

17. 命令模式(Command)

通俗理解:像餐厅的点菜单——顾客点菜写在单子上,厨师按单子做菜,下单的人(顾客)和执行的人(厨师)互不干扰。

Spring Boot应用:Spring的TaskExecutor将任务提交与执行解耦;Jdbc的BatchUpdate也是命令模式的应用。

18. 状态模式(State)

通俗理解:像水的变化——0度以下是冰,0-100度是水,100度以上是水蒸气,同一个对象在不同状态下行为不同。

Spring Boot应用:订单状态管理(待支付→已支付→已发货→已完成),每个状态对应不同的行为逻辑。

19. 中介者模式(Mediator)

通俗理解:像机场塔台——飞机之间不直接沟通,都通过塔台协调,避免混乱。

Spring Boot应用:Spring MVC的DispatcherServlet就是中介者,它接收所有请求,分发给对应的Controller处理。

20. 迭代器模式(Iterator)

通俗理解:像电视遥控器的“下一集”按钮——你不用关心电视剧存在哪里、怎么存的,按一下就能拿到下一个。

Spring Boot应用:Java集合框架的Iterator就是标准实现;Spring Data的Pageable和Slice也提供了分页迭代的能力。

21. 访问者模式(Visitor)

通俗理解:像收银台——超市里商品种类很多(书、食品、电器),但收银员(访问者)可以统一处理每种商品的结算,新增商品类型时不需要改收银逻辑。

Spring Boot应用:较少直接使用,但在AST语法树解析、文件遍历等场景中有应用。

22. 备忘录模式(Memento)

通俗理解:像游戏存档——打Boss前存个档,打输了可以读档重来。

Spring Boot应用:Spring Web Flow中的状态保存;@SessionAttributes也可以看作一种备忘录。

23. 解释器模式(Interpreter)

通俗理解:像翻译官——把一种语言(表达式)翻译成另一种语言(可执行的指令)。

Spring Boot应用:Spring的SpEL(Spring Expression Language)表达式解析就是解释器模式的应用。

// SpEL解析表达式
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("'Hello ' + 'World'");
String message = (String) exp.getValue(); // "Hello World"


总结

分类模式一句话核心Spring Boot典型应用
创建型 单例 全局唯一实例 @Service、@Controller默认单例
创建型 工厂 创建对象统一管理 BeanFactory、ApplicationContext
创建型 抽象工厂 生产整套产品族 @Configuration + @Bean
创建型 建造者 一步步构建复杂对象 RestTemplateBuilder
创建型 原型 复制原型创建新对象 @Scope("prototype")
结构型 适配器 转换接口让不兼容的能合作 HandlerAdapter
结构型 代理 通过中间层增强/控制访问 AOP切面
结构型 装饰器 动态添加新功能 HttpServletRequestWrapper
结构型 外观 封装复杂子系统,提供简单接口 JdbcTemplate
结构型 桥接 抽象与实现独立变化 PlatformTransactionManager
结构型 组合 树形结构统一处理 CompositeCacheManager
结构型 享元 共享对象节省资源 单例Bean
行为型 模板方法 定义骨架,具体步骤子类实现 JdbcTemplate
行为型 策略 算法可互换 Map注入策略类
行为型 观察者 状态变化自动通知 Spring事件机制
行为型 责任链 请求沿链传递直到处理 Spring Security过滤器链
行为型 命令 请求与执行解耦 TaskExecutor
行为型 状态 不同状态不同行为 订单状态机
行为型 中介者 对象间通过中介协调 DispatcherServlet
行为型 迭代器 顺序访问集合元素 Iterator、Spring Data分页
行为型 访问者 在不改变元素前提下定义新操作 较少直接用
行为型 备忘录 保存/恢复对象状态 @SessionAttributes
行为型 解释器 解析表达式/语言 SpEL表达式

提示:如果想深入学习,可以参考一些开源项目,如Gitee上的SpringBoot-DesignMode项目,它用Spring Boot实现了全部23种设计模式的Demo案例。

赞(0)
未经允许不得转载:171主机测评 » 软考高级系统架构师之设计模式篇
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址