java设计模式--迪米特法则

基本介绍

1、一个对象应该对其他对象保持最少的了解
2、类与类关系越密切,耦合度越大
3、迪米特法则又叫最少知道原则,即一个类对自己依赖的类知道的越少越好。也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内部。对外除了提供public方法,不对外泄露任何信息
4、迪米特法则还有个更简单的定义:只与直接朋友通信
5、直接的朋友:每个对象都会与其他对象有耦合关系,只要两个对象只有有耦合关系,我们就说这两个对象之间是朋友关系。耦合的方式很多,依赖,关联,组合,聚合等。其中,我们称出现成员变量,方法参数,方法返回值中的类为直接的朋友,而出现在局部变量中的类不是直接的朋友。也就是说,陌生的类最好不要以局部变量的形式出现在类的内部。

案例分析

public class Demeter1 {
public static void main(String[] args) {
SchoolManager schoolManager = new SchoolManager();
schoolManager.printAllEmployee(new CollegeManage());
}
}

//总部员工的类
class Employee {
private String id;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}
}

//学院员工的类
class CollegeEmployee {
private String id;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}
}

//管理学院员工的类
class CollegeManage {
// 返回学院的所有员工
public List<CollegeEmployee> getAllEmployee() {
List<CollegeEmployee> list = new ArrayList<CollegeEmployee>();
for (int i = 0; i < 10; i++) {
CollegeEmployee emp = new CollegeEmployee();
emp.setId("学院员工id" + i);
list.add(emp);
}
return list;
}

// 输出学院员工的信息
public void printEmployee() {
// 获取学院员工
List<CollegeEmployee> list1 = this.getAllEmployee();
System.out.println("------学院员工------");
for (CollegeEmployee e : list1) {
System.out.println(e.getId());
}
}

}

//管理学校员工的类
class SchoolManager {
// 返回学校总部的所有员工
public List<Employee> getAllEmployee() {
List<Employee> list = new ArrayList<Employee>();
for (int i = 0; i < 5; i++) {
Employee emp = new Employee();
emp.setId("学校总部员工" + i);
list.add(emp);
}
return list;
}

void printAllEmployee(CollegeManage sub) {

/*
 * 分析问题 1.这里的CollegeEmployee 不是 SchoolManager的直接朋友 2.CollegeEmployee
 * 是以局部变量的方式出现在 SchoolManager 3.违反了迪米特法则
 */

/*
 * 解决办法 1.将输出学院的员工方法,转到CollegeEmployee
 */

sub.printEmployee();

// 获取学校总部员工
List<Employee> list2 = this.getAllEmployee();
System.out.println("------学校总部员工------");
for (Employee e : list2) {
System.out.println(e.getId());
}
}
}

上面的代码,CollegeEmployee 不是 SchoolManager的直接朋友,CollegeEmployee是以局部变量的方式出现在SchoolManager,所以违反了迪米特法则

改进代码

public class Demeter1 {
public static void main(String[] args) {
SchoolManager schoolManager = new SchoolManager();
schoolManager.printAllEmployee(new CollegeManage());
}
}

//总部员工的类
class Employee {
private String id;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}
}

//学院员工的类
class CollegeEmployee {
private String id;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}
}

//管理学院员工的类
class CollegeManage {
// 返回学院的所有员工
public List<CollegeEmployee> getAllEmployee() {
List<CollegeEmployee> list = new ArrayList<CollegeEmployee>();
for (int i = 0; i < 10; i++) {
CollegeEmployee emp = new CollegeEmployee();
emp.setId("学院员工id" + i);
list.add(emp);
}
return list;
}
}

//管理学校员工的类
class SchoolManager {
// 返回学校总部的所有员工
public List<Employee> getAllEmployee() {
List<Employee> list = new ArrayList<Employee>();
for (int i = 0; i < 5; i++) {
Employee emp = new Employee();
emp.setId("学校总部员工" + i);
list.add(emp);
}
return list;
}

void printAllEmployee(CollegeManage sub) {
// 获取学院员工
List<CollegeEmployee> list1 = sub.getAllEmployee();
System.out.println("------学院员工------");
for (CollegeEmployee e : list1) {
System.out.println(e.getId());
}

// 获取学校总部员工
List<Employee> list2 = this.getAllEmployee();
System.out.println("------学校总部员工------");
for (Employee e : list2) {
System.out.println(e.getId());
}
}
}

迪米特法则应注意的事项和细节

1、迪米特法则的核心是降低类之间的耦合
2、由于每个类都减少了不必要的依赖,因此迪米特法则知识要求降低类间(对象间)耦合关系,并不是要求完全没有依赖关系

(0)

相关推荐

  • 图解Java设计模式之设计模式七大原则

    图解Java设计模式之设计模式七大原则 2.1 设计模式的目的 2.2 设计模式七大原则 2.3 单一职责原则 2.3.1 基本介绍 2.3.2 应用实例 2.4 接口隔离原则(Interface S ...

  • java中关于方法参数的介绍

    要了解Java中参数传递的原理,首先你要先知道按值传递和按引用传递的区别. 按值传递表示方法接受的是调用者提供的值,按引用传递表示方法接受的是调用者提供的变量地址.一个方法可以修改传递引用所对应的变量 ...

  • 吊打面试官系列:说说hashCode和equals方法

    首先我们需要知道hashCode方法和equals方法都是属于Object类的方法.既然属于Object中public修饰的方法,那言外之就是所有对象默认都有这两个方法,只是有时候有的对象已对这两个方 ...

  • 从零开始:搭建SpringBoot2.X整合Redis框架

    最近也不知道写啥,看之前写过Kafka整合Springboot的文章,大家反响还挺热烈的,嘿嘿嘿,就感觉帮助到大家了还挺好的,也算是达到了自己的目的,正好,今天业务模块是springboot整合red ...

  • 设计模式 - 七大设计原则(三)- 迪米特法则与里氏替换原则

    概述 简单介绍一下七大设计原则: 开闭原则:是所有面向对象设计的核心,对扩展开放,对修改关闭 依赖倒置原则:针对接口编程,依赖于抽象而不依赖于具体 单一职责原则:一个接口只负责一件事情,只能有一个原因 ...

  • 设计模式的七大原则(6) --迪米特法则

    前言 迪米特法则,听名字有点奇怪,但是这个法则真的非常非常有意思,在我看来,这个法则其实描述的就是一个矜持的小姑娘,害羞的惹人怜爱.但是啊,姑娘虽好,切不可"贪杯"哦~ 基本介绍 ...

  • Java设计模式【命令模式】

    命令模式 命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行.这个过程好在,三者相互解耦,任何一方都不 ...

  • 免费下载《Java设计模式(第2版)》.pdf

    回复"面试"获取全套面试资料 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用. 设计模式是软件开发人员在软件开发过程中面临的一 ...

  • java设计模式基础--拦截器

    由于动态代理一般比较难理解,一般都会设计一个拦截器接口供开发者使用,这样开发者就只用知道拦截器接口的方法,含义和作用即可,无须知道动态代理是怎么实现的. 以下代码用JDK动态代理来实现一个拦截器的逻辑 ...

  • java设计模式基础--动态代理

    动态代理的意义在于生成一个代理对象,来代理真实对象,从而控制真实对象的访问.比如你是以为软件工程师,客户带着需求去找公司,显然不会直接和你谈,而是去找商务,此时客户认为商务就代表公司.商务(代理对象) ...

  • Java设计模式之004--代理模式

    代理模式(Proxy) : 为其他对象提供一种代理以控制对这个对象的访问. 代理模式说白了就是"真实对象" 的代表, 在访问对象时引入一定程度的间接性, 因为这种间接性可以附加多种 ...

  • Java设计模式之003--工厂模式

    工厂模式(Factory Pattern) 是 Java 中最常用的设计模式之一. 这种类型的设计模式属于创建型模式, 它提供了一种创建对象的最佳方式. 在工厂模式中, 我们在创建对象时不会对客户端暴 ...

  • Java设计模式之002--策略模式

    策略模式(Strategy Pattern) :定义了一系列的算法, 将每一种算法封装起来并可以相互替换使用, 策略模式让算法独立于使用它的客户应用而独立变化. OO设计原则: 1.面向接口编程(面向 ...