Spring ( 一 ) 依赖耦合

news2024/11/15 19:56:51

1.依赖耦合及解耦

1.1.从<<西游记>>说起

1.1.1.主角介绍

使用 Java 语言中编写一个 HouWang 猴王类

在这里插入图片描述

// 猴王
public class HouWang {
	// 成员变量
	private String mingZi;

    // 无参构造方法
	public HouWang() {
		System.out.println("石破天惊");
	}
	// 有参数构造方法
	public HouWang(String mingZi) {
		this.mingZi = mingZi;
		System.out.println("我" + this.mingZi + "来了");
	}
	// 打招呼
	public void daZhaoHu() {
		System.out.println("大家好,我是" + this.mingZi);
	}
	
    // 得到成员变量的值
	public String getMingZi() {
		return mingZi;
	}
	// 设置成员变量的值
	public void setMingZi(String mingZi) {
		this.mingZi = mingZi;
	}
}

为对象的私有属性赋值 有两种方式

  1. 使用有参构造方法
  2. 使用属性setter方法

1.1.1.1.测试

public class Test {

    public static void main(String[] args) {
        HouWang houWang = new HouWang();
        houWang.daZhaoHu();
    }
}

输出结果 , mingZi为null

石破天惊
大家好,我是null

1.1.1.2.setter方法赋值

        HouWang houWang = new HouWang();
        houWang.setMingZi("孙悟空");
        houWang.daZhaoHu();

输出结果 , mingZi为孙悟空

石破天惊
大家好,我是孙悟空

1.1.1.3.有参构造器

        HouWang houWang = new HouWang("孙行者");
        houWang.daZhaoHu();

输出结果 , 可以看到调用的是有参构造器, mingZi为孙行者

我孙行者来了
大家好,我是孙行者

1.1.2.依赖关系

一个类的某个方法中, 用到另一个类的方法, 两个类之间存在着 临时依赖关系

1.1.2.1.新增加类

增加一个 TieShanGongZhu 铁扇公主 类

在这里插入图片描述

//  铁扇公主
public class TieShanGongZhu {
    // 无参构造方法
    public TieShanGongZhu(){
        System.out.println("我是公主!");
    }

	// 被打
	public void beiDa() {
		System.out.println("臭猴子,肚子疼!");
	}
}

1.1.2.2.猴王类增加方法

HouWang 猴王类 中增加方法 打妖怪

public void daYaoGuai() {
	TieShanGongZhu yg = new TieShanGongZhu();
	yg.beiDa();
}

此时 在 猴王类的 daYaoGuai() 方法中 ,

先 通过 无参构造方法得到 铁扇公主 类的实例 yg

再 通过实例 yg 调用 被打beiDa()方法

此时 猴王类 对 铁扇公主 类 存在 临时依赖

1.1.2.3.测试

修改测试类

  HouWang houWang = new HouWang();
  houWang.daYaoGuai();

输出结果

石破天惊
我是公主!
臭猴子,肚子疼!

1.1.3.耦合的困境

实际的情况 : 猴王类的 daYaoGuai() 方法中可能 临时依赖 不同的 妖怪类

又因为 Java是编译性语言, 不同运行动态修改 类的结构

Java程序在运行前, 先将.java的字符文件编译成 .class的字节码文件, 这样 JVM java虚拟机才能执行

在这里插入图片描述

当然也可以针对不同的妖怪编写不同的方法, 但这种方式会使代码变的不方便维护, 而且同样面对可能增加新的妖怪的问题

在这里插入图片描述

1.1.4.抽象依赖类

根据 依赖方法, 将各类妖怪类抽象成统一的结构

1.1.4.1.抽接口

根据 妖怪类 的共同特点 , 抽取方法 beiDa()

而各个妖怪类中分别 实现 这个方法

在这里插入图片描述

// 妖怪接口
public interface IYaoGuai {
	// 被打方法
	void beiDa();
}

1.1.4.2.各依赖类的实现

TieShanGongZhu 铁扇公主 类 修改为

public class TieShanGongZhu implements IYaoGuai {

	// 无参构造方法
	public TieShanGongZhu(){
		System.out.println("我是公主!");
	}

	@Override
	public void beiDa() {
		// TODO Auto-generated method stub
		System.out.println("臭猴子,肚子疼!");
	}
}

增加 HongHair 红孩儿 类

public class HongHair implements IYaoGuai  {
	
	@Override
	public void beiDa() {
		System.out.println("你是猴子请来的豆饼吗!");
	}
}

增加 NiuMoWang 牛魔王 类

public class NiuMoWang implements IYaoGuai  {

	@Override
	public void beiDa() {
		System.out.println("啊!我牛魔王会回来的!");
	}
}

1.1.5.修改应用类

在这里插入图片描述

  1. 将具体的妖怪替换成对应接口

  2. 将接口提升成私有成员变量

  3. 为接口变量提供公有的setter方法或有参构造

    这样外部代码通过对应方法为猴王类设置依赖的对象
    猴王 依赖的对象不是由猴王类来决定,而是由外部定义

private IYaoGuai yg;

public void daYaoGuai() {
	// TieShanGongZhu yg = new TieShanGongZhu(); 
	yg.beiDa();
}

public void setYg(IYaoGuai yg) {
	this.yg = yg;
}

1.1.5.1.测试

修改测试类,

在测试类中 准备多个满足条件的 依赖类对象

运行结果是根据注入依赖对象的不同而不同

说明 , 应用类 与 依赖类 之间的耦合 降低了

        HouWang houWang = new HouWang();

        IYaoGuai tsgz = new TieShanGongZhu();
        IYaoGuai hhr = new HongHair();
        IYaoGuai nmw = new NiuMoWang();
        // 注入 指定的妖怪
        houWang.setYg(tsgz);

        houWang.daYaoGuai();

输出结果

石破天惊
我是公主!
你是猴子请来的豆饼吗!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/518496.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

知识推理——TransE(知识表示、知识嵌入)

记录一下学习TransE的笔记~ 最后更新时间&#xff1a;20230512 1.要解决的问题 &#xff08;1&#xff09;以往的模型&#xff08;Bayesian clustering和energy-based&#xff09;关注于增强模型的表达能力和普遍性&#xff0c;但却增加了模型的复杂性及计算消耗。 &#xff0…

2023.05.12-给PDF文件添加目录

打开PdgCntEditorcloudshare.lanzouw.com/ijZPj03tmnle 直接把有标题的PDF拖进来&#xff0c;就可以识别生成对应的目录了之后点击保存就可以把目录写到PDF文件中了&#xff0c;非常的方便

23种设计模式之原型模式

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;在一家满意的公司实习。本篇文章将23种设计模式中的原型设计模式&#xff0c;此篇文章为一天学习一个设计模式系列文章&#xff0c;后面会分享其他模式知识。 如果文章有什么需要改进的地方还请大…

(10)Qt---项目打包

目录 项目打包 1. 设置应用图标** 2. Debug与Release模式*** 3. 动态链接库** 4. 程序打包* 5. 新版本Qt的安装与使用* 项目打包 一款正常的软件产品应该在任何的计算机中运行&#xff0c;不需要单独安装Qt的开发环境&#xff0c;因此需要把之前的项目打包成一个安装包。 1. 设…

Ctfshow [单身杯]

文章目录 web签到easyPHPescapeshellcmdescapeshellargsedawk 姻缘测试 web签到 <?php # -*- coding: utf-8 -*- # Author: h1xa # Date: 2022-03-19 12:10:55 # Last Modified by: h1xa # Last Modified time: 2022-03-19 13:27:18 # email: h1xactfer.com # link: h…

Java EE 进阶---多线程(一)

目录 一、常见的锁策略 乐观锁 vs 悲观锁 重量级锁 vs 轻量级锁 读写锁&#xff06;普通互斥锁 自旋锁&#xff06;挂起等待锁 可重入锁&#xff06;不可重入锁 公平锁&#xff06;非公平锁 synchronized实现了哪些锁策略&#xff1f; 二、Compare And Swap 比较并交换…

File类、IO数据流介绍

文章目录 &#x1f412;个人主页&#x1f3c5;JavaSE系列专栏&#x1f4d6;前言&#xff1a;&#x1f380;File类的设计&#x1fa85;数据流的流向 &#x1f3c5;对数据操作的类&#x1f9f8;按单位划分&#x1f9f8;按封装类型划分 &#x1f380;整理File常用方法 &#x1f41…

解析HTTPS的加密

文章目录 简介加密原理对称加密常用的对称加密算法&#xff1a;简单解析DES 非对称加密常用的非对称加密算法&#xff1a;简单解析RSA算法公钥和私钥的制作&#xff1a;加密和解密过程&#xff1a; 加密过程数字证书摘要算法解析一下MD5算法 简介 HTTPS 使用了 SSL (Secure So…

2023最新软件测试八股文,能不能拿心仪Offer就看你背得怎样了

很多同学会问测试面试八股文有必要背吗&#xff1f; 我的回答是&#xff1a;很有必要。你可以讨厌这种模式&#xff0c;但你一定要去背&#xff0c;因为不背你就进不了大厂。 个人感觉目前各个大中厂面试不好的地方是&#xff0c;都在朝着背面试八股文的方向发展&#xff08;曾…

Android Studio实现文件管理器

项目目录 一、项目概述二、开发环境三、详细设计1、布局设计2、程序运行时申请权限3、查看文件4、删除文件5、搜索文件6、新建文件 四、运行演示 一、项目概述 本次带来的文件管理器&#xff0c;能够对SD卡的目录进行管理。主要功能包括新建文件&#xff08;夹&#xff09;、查…

【shell】shell编程之函数

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、概述二、函数的查看和删除1.查看 declare2.删除 declare 三、函数的返回值1.return 返回值2.echo 返回值 四、函数的参数传入与变量范围五、函数的应用1.阶乘2.…

分库分表如何处理主键ID

当关系型数据库数据量过大时&#xff0c;通常会采用分库分表降低数据库查表压力。分库分表有多种&#xff0c;有分一个库多张分表额&#xff0c;有分多个库多张表的。一般分库分表使用ShardingSphere分表&#xff0c;建分片键等。但是分库分表之后&#xff0c;主键ID如何处理呢…

Goby 漏洞更新 |Telesquare TLR-2005Ksh 路由器 getUsernamePassword 信息泄露漏洞

漏洞名称&#xff1a;Telesquare TLR-2005Ksh 路由器 getUsernamePassword 信息泄露漏洞 English Name&#xff1a;Telesquare TLR-2005Ksh getUsernamePassword Information Disclosure CVSS core: 9.0 影响资产数&#xff1a;25826 漏洞描述&#xff1a; Telesquare Tlr…

MATLAB--控制语句--数组操作--符号运算--绘图--文件和数据的处理

控制语句 MATLAB 常用的控制语句有for, while, if, switch 等。 一、循环语句 通过循环控制语句&#xff0c;可以重复执行代码块。循环有两类&#xff1a;for 循环和while 循环。 for 循环是一组语句重复固定的&#xff0c;指定的次数&#xff0c;while 循环是满足条件执行。…

【鸿蒙应用ArkTS开发系列】- http网络库使用讲解和封装

目录 前言http网络库组件介绍http网络库封装创建Har Module创建RequestOption 配置类创建HttpCore核心类创建HttpManager核心类对外组件导出添加网络权限 http网络库依赖和使用依赖http网络库&#xff08;httpLibrary&#xff09;使用http网络库&#xff08;httpLibrary&#x…

“虐人的”双亲委派机制

这些问题&#xff0c;看看你能回答上来多少个&#xff1a; 1、什么是双亲委派&#xff1f; 2、为什么需要双亲委派&#xff0c;不委派有什么问题&#xff1f; 3、”父加载器”和”子加载器”之间的关系是继承的吗&#xff1f; 4、双亲委派是怎么实现的&#xff1f; 5、我能不能…

国外空间服务器是否有利于SEO优化?

​  购买国外空间服务器&#xff0c;这是许多人在做网站时会考虑到的选择。在国内&#xff0c;由于网络环境和限制&#xff0c;所以选择国外的空间似乎是一个不错的选择。但是&#xff0c;国外空间服务器是否对SEO优化有影响?这是一个值得讨论的问题。 1.服务器响应速度 如果…

跟着LearnOpenGL学习4--着色器

文章目录 一、前言二、GLSL2.1、着色器结构2.2、数据类型2.2.1、向量 2.3、输入与输出2.4、uniform2.5、更多属性 三、着色器类 一、前言 在之前绘制三角形的博文中&#xff0c;我们已经接触到了着色器&#xff0c;但是肯定有许多疑问&#xff0c;本文来详细了解一下着色器&am…

【17】SCI易中期刊推荐——计算机信息系统电子与电气(中科院4区)

💖💖>>>加勒比海带,QQ2479200884<<<💖💖 🍀🍀>>>【YOLO魔法搭配&论文投稿咨询】<<<🍀🍀 ✨✨>>>学习交流 | 温澜潮生 | 合作共赢 | 共同进步<<<✨✨ 📚📚>>>人工智能 | 计算机视觉…

Flink从入门到精通之-09状态编程

Flink从入门到精通之-09状态编程 Flink 处理机制的核心&#xff0c;就是“有状态的流式计算”。我们在之前的章节中也已经多次提到了“状态”&#xff08;state&#xff09;&#xff0c;不论是简单聚合、窗口聚合&#xff0c;还是处理函数的应用&#xff0c;都会有状态的身影出…