深入理解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两个类而已。

目录
相关文章
|
17天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
19天前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
12天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
31 1
|
19天前
|
XML 缓存 Java
搞透 IOC、Spring IOC ,看这篇就够了!
本文详细解析了Spring框架的核心内容——IOC(控制反转)及其依赖注入(DI)的实现原理,帮助读者理解如何通过IOC实现组件解耦,提高程序的灵活性和可维护性。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
|
1月前
|
Java 调度 开发者
spring的@Scheduled()有几种定时模式?
【10月更文挑战第12天】spring的@Scheduled()有几种定时模式?
71 1
|
11天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
24 0
|
1月前
|
设计模式 Java Kotlin
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
本教程详细讲解Kotlin语法,适合希望深入了解Kotlin的开发者。对于快速学习Kotlin语法,推荐查看“简洁”系列教程。本文重点介绍了构建者模式在Kotlin中的应用与改良,包括如何使用具名可选参数简化复杂对象的创建过程,以及如何在初始化代码块中对参数进行约束和校验。
21 3
|
1月前
|
设计模式 缓存 Java
面试题:谈谈Spring用到了哪些设计模式?
面试题:谈谈Spring用到了哪些设计模式?
|
1月前
|
Java Spring 容器
Spring IOC、AOP与事务管理底层原理及源码解析
【10月更文挑战第1天】Spring框架以其强大的控制反转(IOC)和面向切面编程(AOP)功能,成为Java企业级开发中的首选框架。本文将深入探讨Spring IOC和AOP的底层原理,并通过源码解析来揭示其实现机制。同时,我们还将探讨Spring事务管理的核心原理,并给出相应的源码示例。
127 9
|
1月前
|
存储 开发框架 Java
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
文章详细介绍了Spring、IOC、DI的概念和关系,解释了控制反转(IOC)和依赖注入(DI)的原理,并提供了IOC的代码示例,阐述了Spring框架作为IOC容器的应用。
29 0
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码