1. 结构型设计模式概述
在软件开发过程中,我们经常会遇到系统结构复杂、类关系混乱的问题。结构型设计模式正是为了解决这些问题而生的利器。它们关注如何将类或对象组合成更大的结构,就像建筑师设计建筑结构一样,让代码更加清晰、灵活、可维护。
1.1 为什么需要结构型设计模式
当系统发展到一定规模后,通常会面临以下典型问题:
- 类之间的关系错综复杂,像一团乱麻难以理清
- 新增功能需要修改大量现有代码,牵一发而动全身
- 内存占用过高导致性能下降
- 代码难以复用和维护
结构型设计模式通过合理的组织方式,帮助我们解决这些问题。它们不是创造新的功能,而是通过优化对象之间的组合关系,让现有功能更好地协同工作。
1.2 结构型设计模式的分类
本文将重点介绍四种最常用的结构型设计模式:
- 适配器模式(Adapter)
- 桥接模式(Bridge)
- 组合模式(Composite)
- 装饰器模式(Decorator)
每种模式都有其独特的应用场景和解决问题的方式。理解它们的区别和适用场景,是灵活运用的关键。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 适配器模式详解
2.1 模式核心思想
适配器模式就像现实世界中的转换插头。想象你要在德国使用中国电器:
- 中国插头是两孔扁头
- 德国插座是两孔圆孔
- 解决方案是使用一个转换插头(适配器)
适配器模式在软件中的作用与此类似:它允许不兼容的接口协同工作,而不需要修改原有的代码。
2.2 电商支付场景实战
假设我们有一个电商系统,原本只支持支付宝支付:
java复制public interface Payment {
void pay(double amount);
}
public class AlipayPayment implements Payment {
@Override
public void pay(double amount) {
System.out.println("调用支付宝API,支付:" + amount);
}
}
现在需要接入银联支付,但银联提供的SDK接口与我们的系统不兼容:
java复制public class UnionPay {
public void doPay(double money) {
System.out.println("调用银联接口,支付金额:" + money);
}
}
直接使用会导致编译错误,因为UnionPay没有实现Payment接口。
2.3 适配器解决方案
我们可以创建一个适配器类:
java复制public class UnionPayAdapter implements Payment {
private UnionPay unionPay;
public UnionPayAdapter(UnionPay unionPay) {
this.unionPay = unionPay;
}
@Override
public void pay(double amount) {
union
