深入理解Spring IOC之设计模式篇(一)、委派模式

简介: 深入理解Spring IOC之设计模式篇(一)、委派模式

前言


在说设计模式这个东西之前,我在这里必须强调的是,任何设计模式的使用都要看上下文,不能单纯的为了设计模式而使用设计模式。这一点是很多学设计模式的人都没有正确理解的,很多人往往只看到某些设计模式可以去匹配某些代码,或者说某些设计模式可以用来修改某些代码,比如之前很多人就喜欢去用策略模式去把代码中的if else无脑的干掉,然后自以为写出了优雅的代码,这种被博客刷多了所留下的后遗症真的是让我无力吐槽。


这个思想很重要:设计模式的使用需要看上下文,而不仅仅是可以那段代码。


正文


废话说完了,我们开始我们本篇文章要说的委派模式,这个玩意其实不属于23种设计模式之一的,但它还是面向对象常用的设计模式之一。实际要怎么用,大家可以参考下面的例子了。

委派模式从字面上面理解的话,可以是这样的,指的是在做某件具体的事情的时候,把整个这件事情或者是这个事情的某个部分的交给了他人做,这个事情也许是我整个链路的一部分,但是复杂度比较高的时候或者是已经有别的人能够很好的处理的情况下(注意这是两种情况),我完全可以让别人做,因此委派给别人。

我们来看看我们在之前文章中提到过的spring统一资源加载这里的PathMatchingResourcePatternReslover这个类,由于它实现了ResourcePatternReslover这个接口,而ResourcePatternReslover又继承了ResourceLoader这个接口,因此它必须实现ResourceLoader中getResource这个方法,我们来看看它是怎么实现的:


@Override
      public Resource getResource(String location) {
          return getResourceLoader().getResource(location);
      }


我们再来看看这里面的getResourceLoader方法:


public ResourceLoader getResourceLoader() {
    return this.resourceLoader;
  }


那么这个this.resourceLoader是哪的呢,来看看PathMatchingResourcePatternReslover的构造方法:


public PathMatchingResourcePatternResolver() {
    this.resourceLoader = new DefaultResourceLoader();
  }
  public PathMatchingResourcePatternResolver(ResourceLoader resourceLoader) {
    Assert.notNull(resourceLoader, "ResourceLoader must not be null");
    this.resourceLoader = resourceLoader;
  }


看到这里相信大家已经看明白了吧,PathMatchingResourcePatternReslover的getResource其实就是完完全全的委派给了resourceLoader来做的。Spring其他地方使用这个的还有很多,就不一一列举了。

我们来看看标准的委派模式的代码吧:


public interface Target {
    void doSomeThing();
}



@Component
public class BDelegate implements Target {
    @Override
    public void doSomeThing() {
        System.out.println("B");
    }
}


@Component
public class ADelegate implements Target {
    @Override
    public void doSomeThing() {
        System.out.println("A");
    }
}



@Component
public class Boss implements Target{
    @Autowired
    private List<Target> targets;
    @Override
    public void doSomeThing() {
        targets.forEach(Target::doSomeThing);
    }
}


一个超简单的例子了。稍微增加点解释下哈,实际使用的时候Boss未必要实现Target接口,Boss中的逻辑也可以是段包含着ADelegate或BDelegate的很复杂的逻辑,总之就是Boss自己没干活交给了ADelegate以及BDelegate两个类而已。

目录
相关文章
|
4天前
|
设计模式 前端开发 搜索推荐
前端必须掌握的设计模式——模板模式
模板模式(Template Pattern)是一种行为型设计模式,父类定义固定流程和步骤顺序,子类通过继承并重写特定方法实现具体步骤。适用于具有固定结构或流程的场景,如组装汽车、包装礼物等。举例来说,公司年会节目征集时,蜘蛛侠定义了歌曲的四个步骤:前奏、主歌、副歌、结尾。金刚狼和绿巨人根据此模板设计各自的表演内容。通过抽象类定义通用逻辑,子类实现个性化行为,从而减少重复代码。模板模式还支持钩子方法,允许跳过某些步骤,增加灵活性。
|
2月前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
5天前
|
XML Java 数据格式
【SpringFramework】Spring IoC-基于XML的实现
本文主要讲解SpringFramework中IoC和DI相关概念,及基于XML的实现方式。
96 69
|
3天前
|
Java Spring 容器
【SpringFramework】Spring IoC-基于注解的实现
本文主要记录基于Spring注解实现IoC容器和DI相关知识。
36 21
|
10天前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
8天前
|
存储 Java 应用服务中间件
【Spring】IoC和DI,控制反转,Bean对象的获取方式
IoC,DI,控制反转容器,Bean的基本常识,类注解@Controller,获取Bean对象的常用三种方式
|
2月前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
30天前
|
存储 缓存 Java
Spring面试必问:手写Spring IoC 循环依赖底层源码剖析
在Spring框架中,IoC(Inversion of Control,控制反转)是一个核心概念,它允许容器管理对象的生命周期和依赖关系。然而,在实际应用中,我们可能会遇到对象间的循环依赖问题。本文将深入探讨Spring如何解决IoC中的循环依赖问题,并通过手写源码的方式,让你对其底层原理有一个全新的认识。
53 2
|
2月前
|
设计模式 安全 Java
Kotlin - 改良设计模式 - 构建者模式
Kotlin - 改良设计模式 - 构建者模式
|
2月前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
46 1