定义:一个对象应该对其他对象保持最少的了解。

问题由来:类与类之间的关系越来越密切,耦合度越来越大,当一个类发生改变时,对另外一个类的影响也越大.

解决方案:尽量降低类与类之间的耦合.

自从我们接触到编程开始,就知道了软件设计的总的原则,低耦合,高内聚,无论是面向对象或者面向过程,耦合度尽量低,才能提高代码的复用率。但是编程怎么编程低耦合呢?

无论逻辑怎么复杂,对于依赖的类来说,都尽量将逻辑封装在类的内部,对外除了提供的public方法,不对外泄露任何信息。还有一个更加简单的定义:只与直接的朋友通信。首先解释一下什么是直接的朋友;每个对象都会与其他对象发生耦合关系,我们就说这两个对象之间有耦合关系,我们就说这两个对象有朋友关系,耦合发生的方式有很多,依赖,关联,组合,聚合等等。其中,我们称出现成员变量,方法参数,方法返回值的类称为直接的朋友,而出现在局部变量中的类为不是直接的朋友,也就是说,陌生的类最好不要作为局部变量的形式出现在类的内部;

举一个例子,在一所学校,里面有老师若干名,依次编号。下面有学生若干名,一次编号。现在要求打印出所有的老师和学生的ID.

先来违反低耦合高内聚原则

代码如下。

package test1;

import java.util.ArrayList;

import java.util.List;

class Teacher{

privateString id;

publicvoidsetId(String id)

{

this.id=id;

}

publicString getId()

{

return id;

}

}

class Student{

private String id;

public void setId(String id)

{

this.id=id;

}

public String getId()

{

return id;

}

}

class StudentManage{

publicList getAllStudent()

{

List list=newArrayList();

for (int i=0;i<100;i++)

{

Student student=new Student();

student.setId("学生学号是"+i);

list.add(student);

}

return list;

}

}

class TeacherManage

{

publicList getAllTeacher()

{

List list=newArrayList();

for (inti=0;i<100;i++)

{

Teacher teacher =new Teacher();

teacher.setId("老师编号"+i);

list.add(teacher);

}

return list;

}

public void printAllPerson(StudentManagestudentmanager)

{

Listlist1=studentmanager.getAllStudent();

for (Student s:list1)

{

System.out.println(s.getId());

}

Listlist2=this.getAllTeacher();

for (Teacher t:list2)

{

System.out.println(t.getId());

}

}

}

public classClient {

publicstaticvoidmain(String[] args) {

TeacherManagetm=newTeacherManage();

tm.printAllPerson(new StudentManage());

}

}

现在这个设计的主要问题出现在TeacherManage类中,根据低耦合高内聚法则,只与直接的朋友进行通信,而Student类并不是TeacherManage类中的直接朋友,应避免类中出现这样非直接朋友关系的耦合。

修改之后代码如下:

package test2;

import java.util.ArrayList;

import java.util.List;

class Teacher{

privateString id;

publicvoidsetId(String id)

{

this.id=id;

}

publicString getId()

{

return id;

}

}

class Student{

private String id;

public void setId(String id)

{

this.id=id;

}

public String getId()

{

return id;

}

}

class StudentManage{

publicList getAllStudent()

{

List list=newArrayList();

for (int i=0;i<100;i++)

{

Student student=new Student();

student.setId("学生学号是"+i);

list.add(student);

}

return list;

}

public void printAllStudent()

{

Listlist1=this.getAllStudent();

for (Student s:list1)

{

System.out.println(s.getId());

}

}

}

class TeacherManage

{

publicList getAllTeacher()

{

List list=newArrayList();

for (inti=0;i<100;i++)

{

Teacher teacher =new Teacher();

teacher.setId("老师编号"+i);

list.add(teacher);

}

return list;

}

publicvoidprintAllTeacher()

{

List list2=this.getAllTeacher();

for (Teacher t:list2)

{

System.out.println(t.getId());

}

}

}

public classClient {

publicstaticvoidmain(String[] args) {

TeacherManagetm=newTeacherManage();

tm.printAllTeacher();

StudentManagesm=newStudentManage();

sm.printAllStudent();

}

}

修改后,学生新增加了学生ID的方法,老师直接来调用即可。从而避免了与学生发生耦合。低耦合高内聚原则的初衷是降低了类之间的耦合,由于每个类减少了不必要的依赖,因此的确可以降低耦合关系,但是凡事有个度,虽然可以避免与非直接的类通信,但是要通信,必然会通过一个“中介”来发生关系。采用此法则可以做到结构清晰,高内聚低耦合、

耦合性与内聚性是模块独立性的两个定性标准,将软件系统划分模块时,尽量做到高内聚低耦合,提高模块的独立性,为设计高质量的软件结构奠定基础。

有个例子很容易明白:一个程序有50个函数,这个程序执行得非常好;然而一旦你修改其中一个函数,其他49个函数都需要做修改,这就是高耦合的后果。

总结

以上就是本文关于高内聚低耦合法则实例代码解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

java 高内聚低耦合_高内聚低耦合法则实例解析相关推荐

  1. java 高内聚低耦合_高内聚低耦合是矛盾的吗?

    随着PMTalk版本的不断迭代,到现在我们已经迭代到5.0了,上线了3年班,在这漫长的时间里,一个产品会在研发中.产品设计有什么问题呢? 这里的问题主要是包含三类 1.技术人员不断变换,代码规范层次不 ...

  2. 步步高vivo高通解锁工具_高通人工智能开放日,窥见5G+AI的未来

    2019年是5G商用的元年.迄今为止全球已有超过20家运营商部署了5G,超过20家硬件厂商发布了5G产品.与4G相比,5G的强劲发展势头已经彰显.5G具有高容量.低延时和高可靠性的特性,将支持包括智能 ...

  3. java设计高并发内存池_高并发服务器-连接池的设计

    高并发服务器-连接池的设计 高并发服务器需要有一些池的设计,如内存池,连接池,数据库连接池. 池(pool)的设计主要考虑到一些资源的频繁申请和释放,尤其是在高并发的服务器中,几万甚至几十万并发每秒, ...

  4. 先传递高八位,后传递低八位_高电子邮件可传递性的7个最佳SMTP服务提供商(2020)

    先传递高八位,后传递低八位 Are you looking for the best SMTP service providers? 您在寻找最佳的SMTP服务提供商吗? An SMTP servic ...

  5. java内存分配模型优点_高并发实战(二)-并发基础 缓存 MESI 内存模型

    左图为高速缓存 右图为多级缓存 数据的读取和存储都经过高速缓存,CPU核心与高速缓存有一条特殊的快速通道.主存与高速缓存都是连接在系统总线上,当然其他组件也是在此基础上进行通信的. 在高速缓存出现后不 ...

  6. java高并发编程艺术_[高并发]Java高并发编程系列开山篇--线程实现

    Java是最早开始有并发的语言之一,再过去传统多任务的模式下,人们发现很难解决一些更为复杂的问题,这个时候我们就有了并发. 引用 多线程比多任务更加有挑战.多线程是在同一个程序内部并行执行,因此会对相 ...

  7. indesign2019怎么存低版本_高版本的InDesign文档怎样存储为早期版本

    有时候,我们需要用 InDesign CS4 或更低版本打开 InDesign CS5 或InDesign CS5.5的文档,怎么做呢?首先,你必须要有InDesign CS5 或InDesign C ...

  8. libevent c++高并发网络编程_高并发编程学习(2)——线程通信详解

    前序文章 高并发编程学习(1)--并发基础 - https://www.wmyskxz.com/2019/11/26/gao-bing-fa-bian-cheng-xue-xi-1-bing-fa-j ...

  9. 高嘌呤食物搜索引擎_“高嘌呤”的食物已发现,尿酸高的人,要尽量挑着吃!...

    导语:在我们的生活中又出现了一种现象,越来越频发,也是越来越倾向于年轻化,那么就是高尿酸,现在高尿酸已经被列为了我们国家的第四高,身体内的嘌呤含量是一部分,那么另一部分也是来源于我们平时摄入的食物,所 ...

最新文章

  1. 边缘计算不再“边缘”
  2. 详解Android实现全屏正确方法
  3. TinkPHP框架学习-01基本知识
  4. 即时通讯软件 的无锁数组操作
  5. Dapper and Repository Pattern in MVC
  6. hibernate的入门
  7. Python中导包问题
  8. Cannot change version of project facet Dynamic Web Module to 3.0
  9. 10款开源网上教学课程管理系统
  10. 高分3号(GF-3)数据参数简介
  11. 宋佳乐和郭晓婷天津之眼观景照片
  12. 触摸世界:10年前我写下这些诗歌,10年后我也不讨厌它们
  13. 【阿里巴巴矢量图库搭建一个属于自己的字体图标库iconfont】
  14. python 实现汇率兑换程序
  15. 条形码控件TBarCode SDK系列教程一(TBarCode OCX篇)
  16. python def -> : ->什么意思
  17. 浅析手机网页制作流程
  18. 0x01.被动信息收集
  19. Linux alsa 声卡驱动 安装 卸载 设置默认声卡
  20. 国外cpa广告联盟emu项目最新介绍

热门文章

  1. 一张图掌握薛兆丰经济学讲义的精华
  2. WEB基础与前端开发--课程表页面的设计
  3. 【每日一题】 959. 由斜杠划分区域
  4. 【GitHub】 github如何使用
  5. L1-029 是不是太胖了 (5分)
  6. 【转载】xp用户自动登录
  7. java上传视频文件到服务器,java视频上传到远程服务器
  8. 基于机器学习的花卉识别
  9. 计算机网络之(4):DNS
  10. 远程配置深度学习服务器详细教程,配置Conda+PyTorch环境