你是否经历过:
代码越改越乱,不敢动祖传代码
添加新功能时牵一发而动全身
重复代码遍地,维护成本飙升
本文用真实电商场景案例+图解+代码,带你打通设计模式的任督二脉!文末附《23种设计模式速查手册》
一、为什么说设计模式是程序员的第二语言?
设计模式的本质:
前人总结的最佳代码结构范式
复杂问题的优雅拆解方案
架构师与开发者的沟通密码
掌握设计模式你将获得:
代码可维护性提升300%
开发效率倍增的"模式直觉"
应对复杂系统的结构化思维
二、7大必会设计模式实战解析
1. 单例模式(Singleton)—— 全局唯一访问点
java
// 双重校验锁实现(线程安全)
public class ConfigManager {
private static volatile ConfigManager instance;
private ConfigManager() {}
public static ConfigManager getInstance() {
if (instance == null) {
synchronized (ConfigManager.class) {
if (instance == null) {
instance = new ConfigManager();
}
}
}
return instance;
}
}
应用场景:配置文件管理、数据库连接池、日志记录器
2. 工厂模式(Factory)—— 对象创建的魔法工厂
java
// 支付方式工厂
public interface Payment {
void pay(BigDecimal amount);
}
public class PaymentFactory {
public static Payment createPayment(String type) {
return switch (type) {
case "ALIPAY" -> new Alipay();
case "WECHAT" -> new WechatPay();
default -> throw new IllegalArgumentException("未知支付方式");
};
}
}
优势:解耦对象创建与使用,符合开闭原则
3. 观察者模式(Observer)—— 事件驱动的核心
java
// 订单状态变化通知
public class Order {
private List observers = new ArrayList<>();
public void addObserver(OrderObserver observer) {
observers.add(observer);
}
private void notifyObservers(OrderStatus status) {
observers.forEach(obs -> obs.update(status));
}
}
// 短信通知观察者
public class SmsNotifier implements OrderObserver {
@Override
public void update(OrderStatus status) {
sendSms("订单状态更新:" + status);
}
}
典型应用:GUI事件处理、消息队列、Spring事件机制
三、高手都在用的进阶模式
4. 策略模式(Strategy)—— 动态替换算法
java
// 运费计算策略
public interface ShippingStrategy {
BigDecimal calculate(Order order);
}
// 策略上下文
public class ShippingCalculator {
private ShippingStrategy strategy;
public void setStrategy(ShippingStrategy strategy) {
this.strategy = strategy;
}
public BigDecimal execute(Order order) {
return strategy.calculate(order);
}
}
适用场景:优惠券计算、排序算法切换、支付路由
5. 装饰者模式(Decorator)—— 动态扩展功能
java
// 咖啡加料系统
public abstract class CoffeeDecorator implements Coffee {
protected Coffee decoratedCoffee;
public CoffeeDecorator(Coffee coffee) {
this.decoratedCoffee = coffee;
}
@Override
public BigDecimal getCost() {
return decoratedCoffee.getCost();
}
}
public class MilkDecorator extends CoffeeDecorator {
public MilkDecorator(Coffee coffee) {
super(coffee);
}
@Override
public BigDecimal getCost() {
return super.getCost().add(new BigDecimal("3.5"));
}
}
设计精髓:开闭原则的完美实践,避免继承爆炸
四、框架背后的设计哲学
6. Spring中的模板方法模式
java
// JDBC模板的抽象实现
public abstract class JdbcTemplate {
public final Object execute(String sql) {
Connection conn = getConnection();
try {
PreparedStatement ps = conn.prepareStatement(sql);
return doInStatement(ps); // 抽象方法
} finally {
releaseConnection(conn);
}
}
protected abstract Object doInStatement(PreparedStatement ps);
}
框架级应用:JdbcTemplate、RestTemplate、TransactionTemplate
7. MyBatis中的代理模式
java
// Mapper接口动态代理
public class MapperProxy implements InvocationHandler {
private SqlSession sqlSession;
public T getMapper(Class mapperInterface) {
return (T) Proxy.newProxyInstance(
mapperInterface.getClassLoader(),
new Class[]{mapperInterface},
this
);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) {
String statementId = method.getDeclaringClass().getName() + "." + method.getName();
return sqlSession.selectOne(statementId, args[0]);
}
}
底层原理:动态代理实现接口与XML的映射
五、设计模式使用误区
过度设计:用简单if能解决的场景强行上模式
判断标准:变化频率 > 3次才考虑模式
教条主义:死板套用GOF原始实现
灵活变通:如Spring的单例是IoC容器级而非ClassLoader级
忽视组合:单一模式解决所有问题
组合策略:工厂+策略+装饰者组合使用更强大
六、现代Java中的新模式趋势
- 函数式编程+模式:Lambda表达式实现策略模式
java
// Lambda版策略模式
shippingCalculator.setStrategy(order -> order.getWeight() * 5);
- 响应式模式:观察者模式的升级(RxJava、Reactor)
- 领域驱动设计:工厂+聚合根模式实现复杂业务
实战福利:关注+转发,私信领取:
《23种设计模式速查手册》高清PDF
《电商系统设计模式实战》源码仓库
[点赞] [收藏] [分享] 三连支持,解锁更多架构师干货!
讨论话题:你在项目中用过最巧妙的设计模式是什么?欢迎评论区分享你的实战经验!
本文暂时没有评论,来添加一个吧(●'◡'●)