spring源码中,委托模式的个人小感受

2023-10-27

委托模式代码

注:不属于 23 种设计模式之一,是面向对象设计模式中常用的一种模式。

public interface Cook {
    void cook();
}

public class 川菜厨子 implements Cook {
    @Override
    public void cook() {
        System.out.println("我是川菜师傅,我的做菜工序有9*9 81到工序,总做及其繁杂,.....省略81行代码");
    }
}

public class 湘菜厨子 implements Cook {
    @Override
    public void cook() {
        System.out.println("我是湘菜师傅,我的做菜工序有7*7 49到工序,工作及其繁杂,.....省略49行代码");
    }
}



public class 业务场景 {
    public static void main(String[] args) {
        //要求 做饭  但是代码不要体现那么多,而且日后菜系还要换,
        // 但是在这个业务场景的代码类 里   不允许更改!!!为了维护时不修改此类中的源代码
        Cook cooker = new 厨师();
        cooker.cook();
    }
}

代码感受

  不知道你看完整个代码有啥感觉,反正我第一次感觉就是什么 静态代理,或者策略模式,还有就是感觉奇奇怪怪的感觉,很不爽,感觉业务场景的代码中直接调用  川菜厨子或者湘菜厨子的函数不是挺好的吗?  搞这么多的花里胡哨的,有问题吧。仔细想想了这都不是重点,涉及模式是一种巧妙的代码编写艺术,我们知道这种编程技巧带来的美感,运用到实际生产中减轻我们的二次开发维护等问题是目的。所以我仔细感受下,咱们暂且不说到底叫什么什么模式,就说他这个编写调用,带来的妙处。我在代码中写了一些注释,如果感受不深我们在看下面举的例子。
  首先把总结再说下:
委托说白了是吧大堆的代码隐藏起来,用一个函数调用简而言之代替大堆,代替并不准确说应该是隐藏!!为啥这么搞,解耦,原来说的解耦单一职责我经常是停留在方法上,通过这个委托模式,感觉是在类的层次上进行解耦。 
  • 栗子来了
* 需求制作一个门:
 零部件要求:  
				1 门框的木材金丝楠木   2 把手为琉璃把手  3 门为水晶钢化玻璃  4 80年代的左右旋转开滑的门锁!
  维护要求:  
				1可以与时俱进,意思零件随时可以替换为市场最好的。
    这里的 1 2 3 4  每个都是组成一个完成的门必要组成,但是这四个部件还必须是灵活可以随时更新的!
  
  拿其中的门锁举例,设计的时候这样考虑:
		
		工匠师傅预先在门上留下一个5*5cm  的一个位置空白给门锁,后来啊随着时代变化,这个门主人为了与时俱进,向我一样(哈哈)要求把这个门锁换成手触摸电子密码锁, 就把门锁替换了密码,替换的时候很简单,这样替换,(锁主人又为了向我一样低调且怀旧,想换完锁呢门从外表来看最好是没变化或者变化很小)由于锁是在门的夹心内部安置的,所以只要把盖子打开,取出80年代的左右开滑的门锁! 放进写有123456789 的电子显示屏的密码锁,然后再盖上盖子,仅仅留下一个显示屏,尽量门的外观不做巨大改动。
	,
	文字不够形象,大家看图片,(领会精神!美感不重要哈!)
	更换前是这个样子 左右旋转可以锁门

在这里插入图片描述

	,更换后是这个样子 去掉旋转按钮,用9键密码锁!

在这里插入图片描述

总结下,这个自认为还算恰当的例子:

此门就像我们写代码一样,要分为几个类 ,1 材料  2 门把手 3 门窗  4 门锁,  但是最好是将这几个类定义成接口!
    并且用一个组装类来,door.java   来组装一个门,而具体组装时就用4个接口类型来调用,这样保证日后维护时,door.java  类不用再去更改代码,仅仅去把具体的实现更改或者更换,或者增加,这都符合开闭原则。

spring 源码中的应用

在这里插入图片描述
在这里插入图片描述
大家看loadBeanDfinitions 被调用了时干活的实际上就是 XmlBeanDefinitionReader(beanFactory) 这个对象,!!!!

==并且后边还有很多,我想你一定明白了为什么spring经常嵌套那么深了吧,看起源码总觉的他那么绕来绕去,其实就是在解耦,方便维护,spring 的代码似乎是一个大的积木,细看是一个个模块。
但是在微观看每个模块就是许多重复的颗粒重复的利用,代码似乎做到了不做多于的冗余,之所以这么说是因为有时一定的冗余是必要的。从现在开始我准备像欣赏美女,哦不!,是艺术品来看待spring,从里到外一点一点拨开它的面纱… ==

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring源码中,委托模式的个人小感受 的相关文章

随机推荐

  • 关于Linux内核编译

    关于生成配置文件 1 首先执行以下命令从老的 xxxx defconfig 文件生成临时使用的 config 文件 根据硬件平台生成临时配置文件 config 比如 make xxxx defconfig make vexpress def
  • MacOS下终端可以连接mysql但是MySQLWorkbench无法连接

    亲测有效 很早前安装了mysql 一直在终端里使用 最近安装了MySQLWorkbench但始终无法连接 整个人都给晕了 但是在MySQLWorkbench的连接界面下始终无法连接成功 在终端测试同样的ip和端口是可以连接成功的 mysql
  • 一网打尽时钟树综合Clock Skew

    一网打尽时钟树综合Clock Skew 文章右侧广告为官方硬广告 与吾爱IC社区无关 用户勿点 点击进去后出现任何损失与社区无关 时间过得很快 今天又上班了 最重要的是公众号还得对得起各位粉丝一直以来的支持 所以必须抽时间码字更文 在五一期
  • C++ 自定义QPushButton有参信号

    C 自定义QPushButton有参信号 ifndef MYWINDOW H define MYWINDOW H include
  • 【无奈】Invalid byte 1 of 1-byte UTF-8 sequence解决方案

    今天在eclipse中编写pom xml文件时 注释中的中文被eclipse识别到错误 Invalid byte 1 of 1 byte UTF 8 sequence 曾多次遇到该问题 问题的根源是 The cause of this is
  • Vue路由hash模式下锚点滚动实现

    1 Vue路由在hash模式下 已被占用 无法使用浏览器的锚点功能 使用js实现锚点滚动功能 使用js实现锚点滚动功能 字符串需要是 id 锚点格式 数字的话标识要滚动的位置 param String Number selector exp
  • qt中自定义关闭按钮的时候绑定关闭事件

    qt中自定义了关闭按钮 如何简单的只用绑定信号跟槽就直接调用事件呢 1 首先在界面中放置一个按钮 重命名为CloseBtn 然后接下来就只需要在构造函数中加上如下的这句 connect ui gt CloseBtn SIGNAL click
  • DFS时,出现内存超限 Memory Limit Exceeded

    DFS时 出现内存超限 Memory Limit Exceeded 很大可能由于dfs死循环 比如 vis 数组一定优先赋值再dfs
  • 最小二乘曲线拟合——C语言算法实现一

    最小二乘曲线拟合 给定一组数据 我们要对这组数据进行曲线拟合 假定要拟合的曲线方程为 y a0 a1 x 1 a2 x 2 a3 x 3 an x n x y 0 995119 7 620000 2 001185 2 460000 2 99
  • Java算法之 n个整数中找出连续m个数加和是最大

    为什么80 的码农都做不了架构师 gt gt gt 分析 m个连续的整数加和是最大 那么最简单的实现方式就是 从下标为0查找m个元素 依次n个数组成的容器进行遍历 每次遍历判断当前最大的m个数之和 遍历结束后返回 public class
  • Linux系统下修改mysql数据库密码

    修改mysql数据库的方法有很多种 这个方法适用于忘记root用户密码或者刚安装mysql要进入mysql时发现系统报错及觉得默认密码太复杂想修改密码的 1 修改 etc my cnf 文件 在 mysql 后面任意一个地方添加以下内容 s
  • 常见问题-打不开宝塔面板

    解决方案 打不开宝塔面板 换个Chrome浏览器打开就可以了
  • jsp或html中给选中的a标签改变颜色和背景色(用源生js)

    我们直接看代码 我是循环遍历的a标签 给每个a标签一个class属性 然后在js中进行设置 这里的if比较是比较目前页面的a标签的值和我们点击传递的serlvet是否是同一个 如果是就改变颜色 我打印一下 在终端给看一下 好的 如果还有什么
  • SPSS(十九)SPSS之时间序列模型(图文+数据集)

    SPSS 十九 SPSS之时间序列模型 图文 数据集 时间序列是指将同一统计指标的数值按其发生的时间先后顺序排列而成的数列 正如人们常说 人生的出场顺序很重要 时间序列中隐藏着一些过去与未来的关系 时间序列分析试图通过研究过去来预测未来 时
  • js中请求数据的$post和$ajax区别(同步和异步问题)

    post和 Ajax都为页面上向后台发送请求 请求数据1 post 因为post默认为异步请求 可是有时候我们会发现 本来要求请求马上出现 可是异步会导致后面突然再执行 这样就出很多问题 2 Ajax 最原始的Ajax 可以控制同步或者异步
  • 1.3.1 手写数字识别之数据处理

    文章目录 概述 一 加载类库 二 读入数据并划分数据集 扩展阅读 为什么针对固定数据集的模型总在不断精进呢 三 训练样本乱序 生成批次数据 四 校验数据有效性 机器校验 人工校验 五 封装数据读取与处理函数 六 异步数据读取 七 扩展阅读
  • Python调用GPT3.5接口的最新方法

    GPT3 5接口调用方法主要包括openai安装 api requestor py替换 接口调用 示例程序说明四个部分 1 openai安装 Python openai库可直接通过pip install openai安装 如果已经安装ope
  • 【力扣】第302场周赛记录

    第302场周赛记录 6120 数组能形成多少数对 6164 数位和相等数对的最大和 6121 裁剪数字后查询第 K 小的数字 6122 使数组可以被整除的最少删除次数 6120 数组能形成多少数对 链接 数组能形成多少数对 描述 给你一个下
  • 深度学习常用激活函数

    神经网络构架过程中常用的激活函数表达式 函数图像和优缺点 激活函数决定输入信号是否或多大程度上应该通过节点 或神经元 传递到下一层 众所周知 神经网络的运算是线性的 引入非线性的激活函数 可以提高神经网络的拟合能力 下面讲解释一些常见的激活
  • spring源码中,委托模式的个人小感受

    文章目录 委托模式代码 代码感受 spring 源码中的应用 委托模式代码 注 不属于 23 种设计模式之一 是面向对象设计模式中常用的一种模式 public interface Cook void cook public class 川菜