JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

掌握这7大设计模式,让你的Java代码从能用变优雅

wys521 2025-03-10 21:24:34 精选教程 76 ℃ 0 评论

你是否经历过:
代码越改越乱,不敢动祖传代码
添加新功能时牵一发而动全身
重复代码遍地,维护成本飙升

本文用真实电商场景案例+图解+代码,带你打通设计模式的任督二脉!文末附《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
《电商系统设计模式实战》源码仓库

[点赞] [收藏] [分享] 三连支持,解锁更多架构师干货!

讨论话题:你在项目中用过最巧妙的设计模式是什么?欢迎评论区分享你的实战经验!

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表