当前位置: 首页 > news >正文

23种设计模式-框架中的使用

系列文章目录

文章目录

  • 系列文章目录
  • 一、单例模式
  • 二、工厂模式
  • 三、代理模式
    • 3.1 Spring AOP 中的动态代理
    • 3.2 MyBatis中的Mapper代理
  • 四、适配器模式
    • 4.1.代码片段
    • 4.2、SpringMVC中的HandlerAdapter
  • 五、责任链模式
    • 5.1、Spring Cloud Gateway 中的 Filter
  • 六、享元模式


一、单例模式

核心思想:保证一个类仅有一个实例,并提供全局访问点
框架应用:全局共享资源,比如spring中的单例bean

public class DefaultSingletonBeanRegistry implements SingletonBeanRegistry {// 存储单例Bean的缓存(key:beanName,value:实例)private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);// 获取单例Bean,核心逻辑:不存在则创建,存在则直接返回@Overridepublic Object getSingleton(String beanName) {return getSingleton(beanName, true);}protected Object getSingleton(String beanName, boolean allowEarlyReference) {// 先从缓存查Object singletonObject = this.singletonObjects.get(beanName);if (singletonObject == null) {// 加锁保证线程安全(双重检查锁)synchronized (this.singletonObjects) {singletonObject = this.earlySingletonObjects.get(beanName);if (singletonObject == null && allowEarlyReference) {// 若未创建,调用createBean创建实例并放入缓存singletonObject = createBean(beanName); // 简化逻辑this.singletonObjects.put(beanName, singletonObject);}}}return singletonObject;}
}

spring通过concurrentHashmap缓存单例实例,结合sync保证线程安全,是懒汉式单例+DCL的实现

二、工厂模式

比如spring中的工厂模式,BeanFactory是spring的核心工厂接口,负责创建和管理Bean

// 工厂接口
public interface BeanFactory {// 获取Bean(由子类实现创建逻辑)Object getBean(String name) throws BeansException;<T> T getBean(Class<T> requiredType) throws BeansException;
}// 实现类:DefaultListableBeanFactory(Spring 最核心的Bean工厂)
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements ConfigurableListableBeanFactory {// 存储Bean定义(创建Bean的元数据)private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);@Overridepublic Object getBean(String name) throws BeansException {// 根据Bean定义创建实例(简化逻辑)BeanDefinition bd = beanDefinitionMap.get(name);return createBean(bd); // 封装了复杂的创建逻辑(如依赖注入、初始化)}
}

用的时候,只需要通过getBean(“xxx”)获取对象,不需要关心Bean的创建依赖注入等细节,由工厂统一处理

三、代理模式

核心思想:通过代理对象控制原对象的访问,可以在原逻辑前后添加额外操作(日志,事务)

3.1 Spring AOP 中的动态代理

spring AOP基于JDK动态代理或者CGLIB代理实现,例如事务管理

// JDK动态代理示例(Spring 内部逻辑简化)
public class JdkDynamicAopProxy implements AopProxy, InvocationHandler {private final AdvisedSupport advised;public JdkDynamicAopProxy(AdvisedSupport config) {this.advised = config;}// 创建代理对象@Overridepublic Object getProxy() {return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),advised.getTargetSource().getTargetClass(),this // InvocationHandler,负责增强逻辑);}// 代理对象的方法调用会触发这里@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 1. 执行前置增强(如事务开始)List<Object> chain = advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);// 2. 执行目标方法(原对象的业务逻辑)Object retVal = method.invoke(target, args);// 3. 执行后置增强(如事务提交)return retVal;}
}

3.2 MyBatis中的Mapper代理

MyBatis 的 Mapper 接口没有实现类,通过代理生成实现

// Mapper代理工厂
public class MapperProxyFactory<T> {private final Class<T> mapperInterface;public MapperProxyFactory(Class<T> mapperInterface) {this.mapperInterface = mapperInterface;}// 创建代理对象public T newInstance(SqlSession sqlSession) {final MapperProxy<T> mapperProxy = new MapperProxy<>(sqlSession, mapperInterface);return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(),new Class[] { mapperInterface },mapperProxy);}
}// 代理逻辑
public class MapperProxy<T> implements InvocationHandler {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 当调用Mapper接口的方法(如selectById),代理对象会执行SQL查询return sqlSession.selectOne(method.getName(), args);}
}

四、适配器模式

核心思想:将一个类的接口转换成客户端期望的另一个接口,解决接口不兼容问题
gateway过滤器里面的适配器模式
在这里插入图片描述

4.1.代码片段

这个实例gateway底层会把所有的过滤器整合到一起,所有的指的是普通过滤和全局过滤器

//普通过滤器实现GateWayFilter接口
List<GatewayFilter> gatewayFilters = route.getFilters();
//全局过滤器实现GlobalFilter接口
List<GatewayFilter> combined = new ArrayList(this.globalFilters);//从下面可以看出,全局过滤器怎么来的,是通过调用loadFilters(globalFilters);//GlobalFilter适配为GatewayFilter,适配是经过GatewayFilterAdapter ,所以这一行代码:
//List<GatewayFilter> combined = new ArrayList(this.globalFilters);
//最终也是成为普通过滤器
public class FilteringWebHandler implements WebHandler {public FilteringWebHandler(List<GlobalFilter> globalFilters) {this.globalFilters = loadFilters(globalFilters);}private static List<GatewayFilter> loadFilters(List<GlobalFilter> filters) {return (List)filters.stream().map((filter) -> {GatewayFilterAdapter gatewayFilter = new GatewayFilterAdapter(filter);if (filter instanceof Ordered) {int order = ((Ordered)filter).getOrder();return new OrderedGatewayFilter(gatewayFilter, order);} else {Order orderx = (Order)AnnotationUtils.findAnnotation(filter.getClass(), Order.class);return (GatewayFilter)(orderx != null ? new OrderedGatewayFilter(gatewayFilter, orderx.value()) : gatewayFilter);}}).collect(Collectors.toList());}

4.2、SpringMVC中的HandlerAdapter

spring mvc中,控制器有多种实现,@Controller\HttpRequestHandler, HandlerAdapter适配不同控制器接口,让DispatcherServlet统一调用

// 适配器接口
public interface HandlerAdapter {// 判断是否支持该控制器boolean supports(Object handler);// 执行控制器逻辑ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
}// 适配 @Controller 注解的控制器
public class RequestMappingHandlerAdapter implements HandlerAdapter {@Overridepublic boolean supports(Object handler) {return handler instanceof HandlerMethod; // 检查是否是@Controller的方法}@Overridepublic ModelAndView handle(...) {// 调用@Controller中的@RequestMapping方法(适配逻辑)return invokeHandlerMethod(request, response, (HandlerMethod) handler);}
}// 适配 HttpRequestHandler 接口的控制器
public class SimpleControllerHandlerAdapter implements HandlerAdapter {@Overridepublic boolean supports(Object handler) {return handler instanceof HttpRequestHandler;}@Overridepublic ModelAndView handle(...) {((HttpRequestHandler) handler).handleRequest(request, response);return null;}
}

五、责任链模式

责任链模式(Chain of Responsibility) 是一种行为型设计模式,它让多个对象有机会处理请求,从而避免请求的发送者与接收者之间的耦合。请求沿着链传递,直到有对象能够处理它为止。

5.1、Spring Cloud Gateway 中的 Filter

在这里插入图片描述

在 Spring Cloud Gateway 中,每个 Filter 都可以对请求或响应进行处理。它们被组织成一个过滤器链(Filter Chain),按照一定的顺序依次执行。
每个 Filter 调用 chain.filter(exchange) 来将请求传递给下一个 Filter。
这种结构类似于责任链:每个节点决定是否处理请求,或者将请求传递给下个节点。

public class MyFilter implements GatewayFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 做一些处理...return chain.filter(exchange); // 把请求传给下一个 Filter}
}

解耦请求的发起者和处理者: 请求(如 HTTP 请求)不需要知道具体的 Filter 是谁,只需要按顺序调用即可。
动态扩展性: 可以在运行时动态添加或移除 Filter,而无需修改原有代码。
灵活控制流程: 某些 Filter 可以提前终止请求(比如权限校验失败),而不必继续传递下去。
职责分离: 每个 Filter 只负责一个功能(如日志记录、限流、鉴权等)。

六、享元模式

待更新

http://www.dtcms.com/a/550438.html

相关文章:

  • 鹧鸪云光储流程系统:储能电站精细化运营的数字基石
  • 深度解构Tokio多线程调度器:从工作窃取到Rust的并发哲学
  • 个人网站可以做推广吗wordpress 亚马逊评论
  • 路桥网站设计wordpress作者信息栏
  • 官方网站建设的四个步骤深圳设计公司招聘信息
  • 湖北洈水水利水电建设公司网站湖南发展最新消息公告
  • 深圳网站建设公司收费标准动漫设计与制作专科学校
  • Agent简介
  • window系统如何用快捷键输入一段文字
  • 手机中有那些常用的5G频段
  • LeetCode:72. 超级次方
  • 网站模板怎么用软件开发流程流程图
  • 东莞seo网站排名wordpress 图片切换插件
  • Algorithm Refinement: ε-Greedy Policy|算法改进:ε-贪婪策略
  • 数学分析简明教程——1.3
  • 请将网站首页底部的备案号网站内容架构拓扑怎么做
  • Flutter---个人信息(2)---实现修改昵称
  • 深入解析 TCP 协议:从细节到实践的全方位解读
  • 题解:P12603 RuShiA(特殊情况下的 RSA 爆破)
  • 营销型网站建设和平台建设网站排行榜查询
  • 【代码】CF915E Physical Education Lessons [动态开点线段树]
  • 打造全新QAgent WeTest AI业务新上线
  • 虚拟主机怎么弄网站网站seo规范
  • 【技术经验】--如何和 Cursor 高效协作
  • 建网上商城的第三方网站哪个好17网站一起做网店潮汕
  • 關於概率部分,準備的三部曲
  • 新人做网站盈利北京小程序 app开发公司
  • 东莞网站设计智能 乐云践新网站开发 所有权
  • 在service方法中已经catch异常,Transactional失效怎么办
  • 服务平台网站设计门户网官网