🎯 设计模式实战指南:从源码解析到Java后端架构的艺术

Scroll Down

🎯 设计模式实战指南:从源码解析到Java后端架构的艺术

概述

本文档基于设计模式分类,详细介绍Java后端开发中各种设计模式的实际应用场景,结合Spring、MyBatis、Redis等主流框架的源码分析,帮助开发者深入理解设计模式在实践中的价值。

一、创建型模式

1. 单例模式(Singleton Pattern)

应用场景

  • 数据库连接池
  • 缓存管理器
  • 配置管理器
  • 日志记录器

Spring框架中的应用

Spring IoC容器本身就是单例模式的典型应用

// Spring ApplicationContext 单例实现
public class AnnotationConfigApplicationContext extends GenericApplicationContext {
    private final AnnotatedBeanDefinitionReader reader;
    private final ClassPathBeanDefinitionScanner scanner;
    
    public AnnotationConfigApplicationContext() {
        this.reader = new AnnotatedBeanDefinitionReader(this);
        this.scanner = new ClassPathBeanDefinitionScanner(this);
    }
}

Spring Bean的默认作用域就是单例

// Spring BeanFactory 中的单例管理
public class DefaultSingletonBeanRegistry extends FactoryBeanRegistrySupport {
    // 单例对象缓存
    private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
    
    protected Object getSingleton(String beanName, boolean allowEarlyReference) {
        Object singletonObject = this.singletonObjects.get(beanName);
        if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
            // 单例创建逻辑
        }
        return singletonObject;
    }
}

Redis客户端单例应用

// JedisPool 单例模式实现
public class RedisManager {
    private static volatile JedisPool jedisPool;
    
    public static JedisPool getInstance() {
        if (jedisPool == null) {
            synchronized (RedisManager.class) {
                if (jedisPool == null) {
                    JedisPoolConfig config = new JedisPoolConfig();
                    config.setMaxTotal(100);
                    config.setMaxIdle(10);
                    jedisPool = new JedisPool(config, "localhost", 6379);
                }
            }
        }
        return jedisPool;
    }
}

2. 工厂方法模式(Factory Method Pattern)

应用场景

  • 数据库连接工厂
  • 消息队列工厂
  • 缓存工厂
  • 序列化器工厂

Spring框架中的应用

BeanFactory - Spring的核心工厂

// Spring BeanFactory 接口
public interface BeanFactory {
    Object getBean(String name) throws BeansException;
    <T> T getBean(String name, Class<T> requiredType) throws BeansException;
    <T> T getBean(Class<T> requiredType) throws BeansException;
}

// 具体实现类
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory
        implements ConfigurableListableBeanFactory, BeanDefinitionRegistry {
    
    @Override
    public <T> T getBean(Class<T> requiredType) throws BeansException {
        return getBean(requiredType, (Object[]) null);
    }
}

MyBatis中的工厂应用

// MyBatis SqlSessionFactory
public interface SqlSessionFactory {
    SqlSession openSession();
    SqlSession openSession(boolean autoCommit);
    SqlSession openSession(Connection connection);
}

// 默认实现
public class DefaultSqlSessionFactory implements SqlSessionFactory {
    @Override
    public SqlSession openSession() {
        return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, false);
    }
}

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

应用场景

  • 数据库访问层抽象
  • 消息中间件抽象
  • 缓存系统抽象

Spring JDBC中的应用

// 数据源抽象工厂
public interface DataSource extends CommonDataSource, Wrapper {
    Connection getConnection() throws SQLException;
    Connection getConnection(String username, String password) throws SQLException;
}

// 具体实现
public class HikariDataSource extends HikariConfig implements DataSource {
    @Override
    public Connection getConnection() throws SQLException {
        return getConnection(username, password);
    }
}

4. 建造者模式(Builder Pattern)

应用场景

  • 复杂对象构建
  • 配置对象构建
  • 查询条件构建

MyBatis中的应用

// MyBatis SqlSessionFactoryBuilder
public class SqlSessionFactoryBuilder {
    public SqlSessionFactory build(InputStream inputStream) {
        return build(inputStream, null, null);
    }
    
    public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
        try {
            XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
            return build(parser.parse());
        } catch (Exception e) {
            throw ExceptionFactory.wrapException("Error building SqlSession.", e);
        }
    }
}

Spring Boot配置构建

// Spring Boot ApplicationBuilder
public class SpringApplicationBuilder {
    private final SpringApplication application;
    
    public SpringApplicationBuilder(Class<?>... sources) {
        this.application = new SpringApplication(sources);
    }
    
    public SpringApplicationBuilder properties(String... defaultProperties) {
        this.application.setDefaultProperties(StringUtils.toStringArray(defaultProperties));
        return this;
    }
}

5. 原型模式(Prototype Pattern)

应用场景

  • 对象克隆
  • 配置复制
  • 模板复制

Spring中的应用

// Spring Bean的prototype作用域
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory {
    @Override
    public Object getBean(String name) throws BeansException {
        return doGetBean(name, null, null, false);
    }
    
    protected <T> T doGetBean(String name, Class<T> requiredType, Object[] args, boolean typeCheckOnly) {
        // 对于prototype作用域的bean,每次都创建新实例
        if (mbd.isPrototype()) {
            Object prototypeInstance = null;
            try {
                beforePrototypeCreation(beanName);
                prototypeInstance = createBean(beanName, mbd, args);
            } finally {
                afterPrototypeCreation(beanName);
            }
            bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
        }
    }
}

二、结构型模式

1. 适配器模式(Adapter Pattern)

应用场景

  • 接口适配
  • 数据格式转换
  • 第三方库集成

Spring MVC中的应用

// HandlerAdapter 适配不同类型的处理器
public interface HandlerAdapter {
    boolean supports(Object handler);
    ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
}

// RequestMappingHandlerAdapter 适配 @RequestMapping 注解的处理器
public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter {
    @Override
    public boolean supports(Object handler) {
        return handler instanceof HandlerMethod;
    }
    
    @Override
    protected ModelAndView handleInternal(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
        // 处理逻辑
    }
}

MyBatis中的适配器

// MyBatis TypeHandler 适配器
public interface TypeHandler<T> {
    void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException;
    T getResult(ResultSet rs, String columnName) throws SQLException;
    T getResult(ResultSet rs, int columnIndex) throws SQLException;
    T getResult(CallableStatement cs, int columnIndex) throws SQLException;
}

// 具体实现
public class StringTypeHandler extends BaseTypeHandler<String> {
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, parameter);
    }
    
    @Override
    public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return rs.getString(columnName);
    }
}

2. 桥接模式(Bridge Pattern)

应用场景

  • 抽象与实现分离
  • 多维度变化
  • 平台无关性

JDBC桥接模式

// JDBC驱动桥接
public interface Driver {
    Connection connect(String url, Properties info) throws SQLException;
    boolean acceptsURL(String url) throws SQLException;
}

// MySQL驱动实现
public class Driver implements java.sql.Driver {
    @Override
    public Connection connect(String url, Properties info) throws SQLException {
        // MySQL连接实现
    }
}

// PostgreSQL驱动实现
public class Driver implements java.sql.Driver {
    @Override
    public Connection connect(String url, Properties info) throws SQLException {
        // PostgreSQL连接实现
    }
}

3. 组合模式(Composite Pattern)

应用场景

  • 树形结构
  • 菜单系统
  • 权限管理

Spring Security中的应用

// Spring Security 权限组合
public interface GrantedAuthority extends Serializable {
    String getAuthority();
}

// 角色权限组合
public class SimpleGrantedAuthority implements GrantedAuthority {
    private final String role;
    
    public SimpleGrantedAuthority(String role) {
        this.role = role;
    }
    
    @Override
    public String getAuthority() {
        return this.role;
    }
}

4. 装饰器模式(Decorator Pattern)

应用场景

  • 功能增强
  • 缓存装饰
  • 日志装饰

Spring AOP装饰器

// Spring AOP 代理装饰
public interface AopProxy {
    Object getProxy();
    Object getProxy(ClassLoader classLoader);
}

// JDK动态代理装饰
public class JdkDynamicAopProxy implements AopProxy, InvocationHandler {
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 前置增强
        // 目标方法调用
        // 后置增强
    }
}

MyBatis插件装饰器

// MyBatis Interceptor 装饰器
public interface Interceptor {
    Object intercept(Invocation invocation) throws Throwable;
    Object plugin(Object target);
    void setProperties(Properties properties);
}

// 分页插件装饰器
public class PageInterceptor implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        // 分页逻辑装饰
        return invocation.proceed();
    }
}

5. 外观模式(Facade Pattern)

应用场景

  • 复杂子系统封装
  • API简化
  • 统一接口

Spring Boot自动配置外观

// Spring Boot 自动配置外观
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

// 内部封装了复杂的配置过程
public class SpringApplication {
    public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {
        return new SpringApplication(primarySources).run(args);
    }
}

6. 享元模式(Flyweight Pattern)

应用场景

  • 对象池
  • 缓存
  • 字符串常量池

数据库连接池

// HikariCP 连接池享元模式
public class HikariDataSource extends HikariConfig implements DataSource {
    private final HikariPool pool;
    
    @Override
    public Connection getConnection() throws SQLException {
        return pool.getConnection();
    }
}

// 连接池管理
public class HikariPool extends PoolBase {
    private final ConcurrentBag<PoolEntry> connectionBag;
    
    public Connection getConnection() throws SQLException {
        PoolEntry poolEntry = connectionBag.borrow(connectionTimeout, MILLISECONDS);
        return poolEntry.createProxyConnection(now(), leakTaskFactory.schedule(poolEntry));
    }
}

7. 代理模式(Proxy Pattern)

应用场景

  • 远程代理
  • 虚拟代理
  • 保护代理
  • 缓存代理

Spring AOP代理

// Spring AOP 代理实现
public class ProxyFactory extends ProxyCreatorSupport {
    public Object getProxy() {
        return createAopProxy().getProxy();
    }
}

// CGLIB代理
public class CglibAopProxy implements AopProxy {
    @Override
    public Object getProxy() {
        return getProxy(null);
    }
    
    @Override
    public Object getProxy(ClassLoader classLoader) {
        // CGLIB代理创建逻辑
    }
}

MyBatis动态代理

// MyBatis Mapper代理
public class MapperProxy<T> implements InvocationHandler, Serializable {
    private final SqlSession sqlSession;
    private final Class<T> mapperInterface;
    
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 动态代理逻辑
        return sqlSession.selectOne(statement, args);
    }
}

三、行为型模式

1. 责任链模式(Chain of Responsibility Pattern)

应用场景

  • 过滤器链
  • 异常处理链
  • 权限验证链

Spring Security过滤器链

// Spring Security 过滤器链
public class FilterChainProxy extends GenericFilterBean {
    private List<SecurityFilterChain> filterChains;
    
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        doFilterInternal(request, response, chain);
    }
    
    private void doFilterInternal(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 过滤器链执行逻辑
        for (Filter filter : filters) {
            filter.doFilter(request, response, chain);
        }
    }
}

MyBatis插件链

// MyBatis 插件责任链
public class Plugin implements InvocationHandler {
    private final Object target;
    private final Interceptor interceptor;
    
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        return interceptor.intercept(new Invocation(target, method, args));
    }
}

2. 命令模式(Command Pattern)

应用场景

  • 操作封装
  • 事务管理
  • 异步处理

Spring事务命令

// Spring 事务命令模式
public interface TransactionTemplate {
    <T> T execute(TransactionCallback<T> action) throws TransactionException;
}

// 具体实现
public class TransactionTemplate extends DefaultTransactionDefinition implements TransactionOperations {
    @Override
    public <T> T execute(TransactionCallback<T> action) throws TransactionException {
        TransactionStatus status = this.transactionManager.getTransaction(this);
        T result;
        try {
            result = action.doInTransactionWithoutResult(status);
        } catch (RuntimeException | Error ex) {
            rollbackOnException(status, ex);
            throw ex;
        }
        this.transactionManager.commit(status);
        return result;
    }
}

3. 解释器模式(Interpreter Pattern)

应用场景

  • 表达式解析
  • 配置解析
  • 查询语言解析

MyBatis SQL解析

// MyBatis SQL解析器
public class SqlSourceBuilder {
    public SqlSource parse(String originalSql, Class<?> parameterType, Map<String, Object> additionalParameters) {
        ParameterMappingTokenHandler handler = new ParameterMappingTokenHandler(configuration, parameterType, additionalParameters);
        GenericTokenParser parser = new GenericTokenParser("#{", "}", handler);
        String sql = parser.parse(originalSql);
        return new StaticSqlSource(configuration, sql, handler.getParameterMappings());
    }
}

4. 迭代器模式(Iterator Pattern)

应用场景

  • 集合遍历
  • 分页查询
  • 流式处理

Spring Data分页迭代

// Spring Data 分页迭代器
public interface Page<T> extends Slice<T> {
    int getTotalPages();
    long getTotalElements();
    List<T> getContent();
}

// 具体实现
public class PageImpl<T> implements Page<T> {
    private final List<T> content;
    private final Pageable pageable;
    private final long total;
    
    @Override
    public Iterator<T> iterator() {
        return content.iterator();
    }
}

5. 中介者模式(Mediator Pattern)

应用场景

  • 组件通信
  • 事件处理
  • 协调管理

Spring事件机制

// Spring 事件中介者
public interface ApplicationEventPublisher {
    void publishEvent(ApplicationEvent event);
    void publishEvent(Object event);
}

// 具体实现
public class SimpleApplicationEventMulticaster extends AbstractApplicationEventMulticaster {
    @Override
    public void multicastEvent(ApplicationEvent event) {
        multicastEvent(event, resolveDefaultEventType(event));
    }
    
    @Override
    public void multicastEvent(final ApplicationEvent event, ResolvableType type) {
        // 事件分发逻辑
        for (ApplicationListener<?> listener : getApplicationListeners(event, type)) {
            invokeListener(listener, event);
        }
    }
}

6. 备忘录模式(Memento Pattern)

应用场景

  • 状态保存
  • 事务回滚
  • 撤销操作

Spring事务状态管理

// Spring 事务状态备忘录
public interface TransactionStatus extends SavepointManager, Flushable {
    boolean isNewTransaction();
    boolean hasTransaction();
    boolean isRollbackOnly();
    boolean isCompleted();
}

// 具体实现
public class DefaultTransactionStatus extends AbstractTransactionStatus {
    private final Object transaction;
    private final boolean newTransaction;
    private boolean rollbackOnly;
    private boolean completed;
}

7. 观察者模式(Observer Pattern)

应用场景

  • 事件通知
  • 状态同步
  • 日志记录

Spring事件机制

// Spring 观察者模式
public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {
    void onApplicationEvent(E event);
}

// 具体实现
@Component
public class UserEventListener implements ApplicationListener<UserCreatedEvent> {
    @Override
    public void onApplicationEvent(UserCreatedEvent event) {
        // 处理用户创建事件
        System.out.println("User created: " + event.getUser());
    }
}

8. 状态模式(State Pattern)

应用场景

  • 状态机
  • 工作流
  • 订单状态

Spring状态机

// Spring Statemachine 状态模式
public interface StateMachine<S, E> {
    State<S, E> getState();
    void sendEvent(E event);
    void start();
    void stop();
}

// 具体实现
@Configuration
@EnableStateMachine
public class OrderStateMachineConfig extends StateMachineConfigurerAdapter<OrderState, OrderEvent> {
    @Override
    public void configure(StateMachineStateConfigurer<OrderState, OrderEvent> states) throws Exception {
        states
            .withStates()
            .initial(OrderState.CREATED)
            .state(OrderState.PAID)
            .state(OrderState.SHIPPED)
            .end(OrderState.DELIVERED);
    }
}

9. 策略模式(Strategy Pattern)

应用场景

  • 算法选择
  • 支付方式
  • 缓存策略

Spring缓存策略

// Spring 缓存策略
public interface CacheManager {
    Cache getCache(String name);
    Collection<String> getCacheNames();
}

// Redis缓存策略
public class RedisCacheManager implements CacheManager {
    @Override
    public Cache getCache(String name) {
        return new RedisCache(name, redisTemplate);
    }
}

// EhCache缓存策略
public class EhCacheCacheManager implements CacheManager {
    @Override
    public Cache getCache(String name) {
        return new EhCacheCache(name, ehcache);
    }
}

10. 模板方法模式(Template Method Pattern)

应用场景

  • 算法框架
  • 流程控制
  • 代码复用

Spring JdbcTemplate

// Spring JdbcTemplate 模板方法
public class JdbcTemplate extends JdbcAccessor implements JdbcOperations {
    @Override
    public <T> T queryForObject(String sql, Class<T> requiredType, Object... args) throws DataAccessException {
        return queryForObject(sql, args, requiredType);
    }
    
    @Override
    public <T> T queryForObject(String sql, Object[] args, Class<T> requiredType) throws DataAccessException {
        List<T> results = queryForList(sql, args, requiredType);
        return DataAccessUtils.singleResult(results);
    }
    
    // 模板方法,子类可以重写
    protected <T> List<T> queryForList(String sql, Object[] args, Class<T> elementType) throws DataAccessException {
        return query(sql, args, getSingleColumnRowMapper(elementType));
    }
}

11. 访问者模式(Visitor Pattern)

应用场景

  • 数据结构操作
  • 编译优化
  • 代码生成

Spring Bean访问者

// Spring Bean访问者
public interface BeanDefinitionVisitor {
    void visitBeanDefinition(BeanDefinition beanDefinition);
}

// 具体实现
public class BeanDefinitionVisitorImpl implements BeanDefinitionVisitor {
    @Override
    public void visitBeanDefinition(BeanDefinition beanDefinition) {
        // 访问Bean定义
        String beanClassName = beanDefinition.getBeanClassName();
        // 处理逻辑
    }
}

四、设计原则在Java后端开发中的应用

1. 单一职责原则(SRP)

// 好的设计:职责分离
@Service
public class UserService {
    public User createUser(UserDTO userDTO) {
        // 只负责用户创建逻辑
    }
}

@Service
public class EmailService {
    public void sendWelcomeEmail(User user) {
        // 只负责邮件发送逻辑
    }
}

2. 开闭原则(OCP)

// 通过接口扩展,对修改关闭
public interface PaymentStrategy {
    void pay(BigDecimal amount);
}

@Component
public class AlipayStrategy implements PaymentStrategy {
    @Override
    public void pay(BigDecimal amount) {
        // 支付宝支付逻辑
    }
}

@Component
public class WechatPayStrategy implements PaymentStrategy {
    @Override
    public void pay(BigDecimal amount) {
        // 微信支付逻辑
    }
}

3. 里氏替换原则(LSP)

// 子类可以替换父类
public interface Cache {
    void put(String key, Object value);
    Object get(String key);
}

public class RedisCache implements Cache {
    @Override
    public void put(String key, Object value) {
        // Redis实现
    }
    
    @Override
    public Object get(String key) {
        // Redis实现
    }
}

public class EhCache implements Cache {
    @Override
    public void put(String key, Object value) {
        // EhCache实现
    }
    
    @Override
    public Object get(String key) {
        // EhCache实现
    }
}

4. 接口隔离原则(ISP)

// 接口分离,避免胖接口
public interface UserReader {
    User findById(Long id);
    List<User> findAll();
}

public interface UserWriter {
    User save(User user);
    void delete(Long id);
}

public interface UserService extends UserReader, UserWriter {
    // 组合多个小接口
}

5. 依赖倒置原则(DIP)

// 依赖抽象而不是具体实现
@Service
public class OrderService {
    private final PaymentStrategy paymentStrategy;
    
    public OrderService(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }
    
    public void processOrder(Order order) {
        paymentStrategy.pay(order.getAmount());
    }
}

6. 迪米特法则(LoD)

// 减少对象间的耦合
@Service
public class OrderService {
    private final UserService userService;
    
    public void createOrder(OrderDTO orderDTO) {
        // 不直接访问User的内部属性
        User user = userService.getUserById(orderDTO.getUserId());
        // 通过User的方法获取需要的信息
        if (user.canCreateOrder()) {
            // 创建订单逻辑
        }
    }
}

7. 合成复用原则(CRP)

// 优先使用组合而不是继承
@Service
public class OrderService {
    private final UserService userService;
    private final ProductService productService;
    private final PaymentService paymentService;
    
    // 通过组合复用功能,而不是继承
    public Order createOrder(OrderDTO orderDTO) {
        User user = userService.getUserById(orderDTO.getUserId());
        Product product = productService.getProductById(orderDTO.getProductId());
        // 创建订单逻辑
        return order;
    }
}

五、设计模式的最佳实践

1. 模式选择原则

  • 优先使用组合而非继承
  • 针对接口编程而非实现
  • 遵循开闭原则
  • 保持简单性

2. 常见反模式

  • 过度设计:不要为了使用模式而使用模式
  • 模式滥用:避免在不合适的地方使用设计模式
  • 忽略性能:某些模式可能带来性能开销

3. 性能考虑

// 单例模式的双重检查锁定
public class Singleton {
    private static volatile Singleton instance;
    
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

4. 测试友好性

// 依赖注入便于测试
@Service
public class UserService {
    private final UserRepository userRepository;
    private final EmailService emailService;
    
    public UserService(UserRepository userRepository, EmailService emailService) {
        this.userRepository = userRepository;
        this.emailService = emailService;
    }
    
    // 方法便于单元测试
    public User createUser(UserDTO userDTO) {
        User user = new User(userDTO);
        user = userRepository.save(user);
        emailService.sendWelcomeEmail(user);
        return user;
    }
}

总结

设计模式是Java后端开发中的重要工具,它们帮助我们:

  1. 提高代码质量:通过模式化的设计,代码更加清晰、可维护
  2. 增强可扩展性:遵循开闭原则,便于功能扩展
  3. 提升开发效率:复用成熟的设计方案,避免重复造轮子
  4. 改善团队协作:统一的代码风格和架构模式

在实际开发中,应该根据具体场景选择合适的模式,避免过度设计,同时注重性能和可测试性。通过深入理解Spring、MyBatis等主流框架的源码,我们可以更好地掌握设计模式的实际应用。