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

目录
相关文章
|
28天前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
5天前
|
Java 调度 开发者
spring的@Scheduled()有几种定时模式?
【10月更文挑战第12天】spring的@Scheduled()有几种定时模式?
13 1
|
8天前
|
设计模式 Java Kotlin
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
本教程详细讲解Kotlin语法,适合希望深入了解Kotlin的开发者。对于快速学习Kotlin语法,推荐查看“简洁”系列教程。本文重点介绍了构建者模式在Kotlin中的应用与改良,包括如何使用具名可选参数简化复杂对象的创建过程,以及如何在初始化代码块中对参数进行约束和校验。
12 3
|
1月前
|
XML Java 测试技术
spring复习01,IOC的思想和第一个spring程序helloWorld
Spring框架中IOC(控制反转)的思想和实现,通过一个简单的例子展示了如何通过IOC容器管理对象依赖,从而提高代码的灵活性和可维护性。
spring复习01,IOC的思想和第一个spring程序helloWorld
|
12天前
|
设计模式 缓存 Java
面试题:谈谈Spring用到了哪些设计模式?
面试题:谈谈Spring用到了哪些设计模式?
|
21天前
|
Java Spring 容器
Spring IOC、AOP与事务管理底层原理及源码解析
【10月更文挑战第1天】Spring框架以其强大的控制反转(IOC)和面向切面编程(AOP)功能,成为Java企业级开发中的首选框架。本文将深入探讨Spring IOC和AOP的底层原理,并通过源码解析来揭示其实现机制。同时,我们还将探讨Spring事务管理的核心原理,并给出相应的源码示例。
77 9
|
18天前
|
存储 开发框架 Java
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
文章详细介绍了Spring、IOC、DI的概念和关系,解释了控制反转(IOC)和依赖注入(DI)的原理,并提供了IOC的代码示例,阐述了Spring框架作为IOC容器的应用。
17 0
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
|
27天前
|
缓存 Java Spring
手写Spring Ioc 循环依赖底层源码剖析
在Spring框架中,IoC(控制反转)是一个核心特性,它通过依赖注入(DI)实现了对象间的解耦。然而,在实际开发中,循环依赖是一个常见的问题。
33 4
|
5天前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
17 0
|
1月前
|
XML Java 开发者
经典面试---spring IOC容器的核心实现原理
作为一名拥有十年研发经验的工程师,对Spring框架尤其是其IOC(Inversion of Control,控制反转)容器的核心实现原理有着深入的理解。
80 3