程序的耦合和解耦

耦合

指的是程序间的依赖关系,包括类之间的依赖和方法间的依赖

解耦

降低程序间的依赖关系,实际开发中应该做到编译器不依赖,运行时才依赖

解耦的思路

使用反射来创建对象,而避免使用new关键字

通过读取配置文件来获取要创建的对象的全限定类名

举例

下面请看一个简单的例子,模拟账号保存

该项目的文件结构如图

业务层的接口及其实现类:

package com.itheima.service;

/**

* @Author:Zzq

* @Description:账户的业务层的接口

* @Date:2020/6/13

* @Time:15:50

*/

public interface iAccountService {

/**

*@Author:Zzq

*@Description:模拟保存账户

*@Date:2020/6/13

*@Param: * @param null

*/

void saveAccount();

}

package com.itheima.service.impl;

import com.itheima.factory.BeanFactory;

import com.itheima.mapper.iAccountMapper;

import com.itheima.service.iAccountService;

/**

* @Author:Zzq

* @Description:账号的业务实现类

* @Date:2020/6/13

* @Time:15:53

*/

public class AccountServiceImpl implements iAccountService {

private iAccountMapper accountMapper = new AccountMapperImpl();

@Override

public void saveAccount() {

accountMapper.saveAccount();

}

}

持久层的接口及其实现类

package com.itheima.mapper;

/**

* @Author:Zzq

* @Description:账户的持久层接口

* @Date:2020/6/13

* @Time:16:08

*/

public interface iAccountMapper {

void saveAccount();

}

package com.itheima.mapper.impl;

import com.itheima.mapper.iAccountMapper;

/**

* @Author:Zzq

* @Description:账户的持久层实现类

* @Date:2020/6/13

* @Time:16:10

*/

public class AccountMapperImpl implements iAccountMapper {

public void saveAccount(){

System.out.println("保存了");

}

}

最后是main函数,也是其表现层

package com.itheima.ui;

import com.itheima.factory.BeanFactory;

import com.itheima.service.iAccountService;

/**

* @Author:Zzq

* @Description:模拟一个表现层,用于调用业务

* @Date:2020/6/13

* @Time:22:28

*/

public class Client {

public static void main(String[] args) {

AccountServiceImpl as = new AccountServiceImpl();

as.saveAccount();

}

}

从代码中可以看到,各个层次是相互依赖,层层套用,这样就称之为高耦合,各个代码块之间独立性较差,下面就按照解耦的思路来尽可能降低耦合,如下:

1.在项目文件中新建一个factory包,新建一个BeanFactory类来建立一个bean工厂来创建我们的service和mapper对象,并写好Bean.properties配置文件

package com.itheima.factory;

import java.io.InputStream;

import java.util.Properties;

/**

* @Author:Zzq

* @Description:是一个创建bean对象的工厂

*

* Bean:在计算机英语中,有可重用组件的含义。

* JavaBean:用Java编写的可重用组件。

* Java >> 实体类

* 它就是创建我们的service和mapper对象的。

* 1.需要一个配置文件来配置我们的service和mapper

* 配置的内容:唯一标识 = 全限定类名(key = value)

* 2.通过读取配置文件的配置内容,反射创建对象

*

* 配置文件可以是xml也可以是properties

* @Date:2020/6/13

* @Time:22:36

*/

public class BeanFactory {

//定义一个properties对象

private static Properties props;

//使用静态代码块为Properties对象赋值

static {

try {

//实例化对象

props = new Properties();

//获取properties文件的流对象

InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");

props.load(in);

}catch (Exception e) {

throw new ExceptionInInitializerError("初始化properties失败");

}

}

/**

*@Author:Zzq

*@Description:根据bean的名称获取bean对象

*@Date:2020/6/13

*@Param: * @param null

*/

public static Object getBean(String beanName){

Object bean = null;

try {

String beanPath = props.getProperty(beanName);

bean = Class.forName(beanPath).newInstance();

}catch (Exception e){

e.printStackTrace();

}

return bean;

}

}

accountService = com.itheima.service.impl.AccountServiceImpl

accountMapper = com.itheima.mapper.impl.AccountMapperImpl

2.修改Client.java和AccountServiceImpl.java代码,使用反射来创建对象

package com.itheima.ui;

import com.itheima.factory.BeanFactory;

import com.itheima.service.iAccountService;

/**

* @Author:Zzq

* @Description:模拟一个表现层,用于调用业务

* @Date:2020/6/13

* @Time:22:28

*/

public class Client {

public static void main(String[] args) {

iAccountService as = (iAccountService) BeanFactory.getBean("accountService");

as.saveAccount();

}

}

package com.itheima.service.impl;

import com.itheima.factory.BeanFactory;

import com.itheima.mapper.iAccountMapper;

import com.itheima.service.iAccountService;

/**

* @Author:Zzq

* @Description:账号的业务实现类

* @Date:2020/6/13

* @Time:15:53

*/

public class AccountServiceImpl implements iAccountService {

private iAccountMapper accountMapper = (iAccountMapper) BeanFactory.getBean("accountMapper");

@Override

public void saveAccount() {

accountMapper.saveAccount();

}

}

以上就是解耦的过程,在使用了BeanFactory了之后,就算是删除掉了service或mapper文件,编译器也不会报错,有人看到这里肯定会说:啊,你这不是脱裤子放屁嘛,明明几个类就能解决的问题非要弄个工厂?其实是这个例子太高简单,还不足以看出低耦合的好处,在以后比较大型的开发中,如果有新的需求要加入,我们就可以只添加几个类就能完成,而不用重新考虑整个程序,避免牵一发而动全身。

java 耦合解耦_程序的耦合和解耦相关推荐

  1. java 耦合解耦_为什么工厂模式可以解耦?why?

    我们新建一个工厂,称为BeanFactory /** * 定义一个bean工厂,专门生产普通对象 */ public class BeanFactory { public static UserDao ...

  2. java 分层处理解耦_后端分层架构如何解耦?

    做业务不要先考虑"解耦",而是要先满足业务流程.即你的程序的结构应该是一个个纵向的业务流,从controller到最后的数据存储.不同的业务流不会相互干扰. 等到你做了很多个业务流 ...

  3. java浪漫代码_程序员表白代码,用过的人都找到了对象...

    在情人节送给自己的女朋友玫瑰花, 对于程序员来说是不是太普通了呢? 为什么不试试让情人节变得更特别一些呢? 作为一名程序员, 可以用自己的技术创造出不一样的浪漫! 让你的女朋友眼前一亮,印象深刻. 这 ...

  4. java开发名言_程序员名言语录

    [导语]1.程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术. 2.其实你找不到错误不代表错误不存在,同样你看不到技术比你牛的人并不代表世界上没有技术比你牛的人. 3.一个人静静 ...

  5. java语言情话_程序员的浪漫:用 java 实现每天给对象法发情话

    一.引言 最近看到一篇用js代码实现表白的文章,深有感触. 然后发现自己也可以用java代码实现,然后就开始写代码了,发现还挺有意思的,话不多说开搞 实现思路: 使用HttpClient远程获取彩虹屁 ...

  6. java粒子特效_程序员20分钟搞定粒子效果, 仅仅200行代码

    原标题:程序员20分钟搞定粒子效果, 仅仅200行代码 这粒子的打造,确实没有布局代码,稍后大家在源码上可以看到,css代码都只有几行,绝大部分代码都是java代码,而且是原生java书写的,现在很多 ...

  7. java 前置零_程序员面试必考题(二十二):Java中的前置条件和后置条件

    转载自微信公众账号:开点工作室(ID:kaidiancs) Java程序中,程序员可以使用前置条件与后置条件,来控制是否执行方法及判断方法是否正确执行. 前置条件(precondition)是一条条件 ...

  8. java斗地主发牌_程序员:Java斗地主部分功能实现:创建牌、发牌并按牌id对其排序...

    Java斗地主部分功能实现 本文来自于一个斗地主程序编写的小练习,斗地主中,需要将牌打乱后将牌发给玩家,再按照从大到小的顺序发给各个玩家.考虑到卡牌的花色的数字并不能代表其在游戏规则中的大小,因此引入 ...

  9. java个性签名_程序员用搞笑个性签名

    1.栈和队列的区别是啥?吃多了拉就是队列:吃多了吐就是栈 2.世界上最遥远的距离不是生与死,而是你亲手制造的BUG就在你眼前,你却怎么都找不到她. 3.<c++程序设计语言>比<c程 ...

最新文章

  1. 更改as的默认gradle地址_面试官:谈谈这4种磁盘IO调度算法--CFQ、NOOP、Deadline、AS...
  2. 六:Dubbo与Zookeeper、SpringMvc整合和使用
  3. switch中default的用法
  4. 八个被现代科学证实的古老信条
  5. 邮件营销的三个基本要素讲解
  6. 课程设计:混合数据排序
  7. Linux基础——怎么样从 MacOS 或 Linux 通过 SSH 远程 Linux
  8. 21幅非常有创意的倒影摄影作品欣赏
  9. (三)mybatisPlus自定义Sql语句
  10. 易优CMS:arcview的基础用法
  11. oracle怎么看日志文件,Oracle日志文件的管理与查看
  12. 登陆服务器显示guest,登录界面如何隐藏guest账号
  13. 详细解LeetCode 1284. Minimum Number of Flips to Convert Binary Matrix to Zero Matrix
  14. GSM和GPRS区别
  15. 广告行业计费模式专业术语
  16. 职场人士,如何打造“自品牌”?
  17. 中班音乐活动计算机反思,中班音乐优质教案《计算器》含反思
  18. 生成排列 --- 蛮力法,Johnson-Trotter算法
  19. Windows Mobile四大猜想 能否取代Windows?
  20. 首都师范学院计算机,2020年首都师范大学计算机应用技术考研分析

热门文章

  1. gui开头的歌词_首字拼音是gui的成语-以gui开头的成语大全「溜趣成语网」
  2. 量子BB84,B92协议简单介绍
  3. html雨滴状的图案代码,HTML_HTML5实现晶莹剔透的雨滴特效,复制代码代码如下: html - phpStudy...
  4. 用户画像分析与场景应用
  5. 1005--HBase操作实战(HBase Shell命令行模式)
  6. python研发岗简历_【干货】不谈具体面经,说说研发岗简历编写、面试技巧
  7. 计算机网络钟中PCF,请问,为什么我向时钟芯片PCF8563中写入初始化数据后,读出来...
  8. 天童美语植树节:前人栽树后人乘凉
  9. 关于STM32空闲中断
  10. 守护进程——解放本地PC