面向对象设计--迪米特法则(最少知道原则)

定义

  • 一个对象应该对其他对象有最少的了解。
    • 如果一个方法放在本类中,即不增加类间关系,也对本类不产生负面影响,那就放到本类中。
    • 尽量不要对外公开太多的public方法和非静态的public变量,尽量内敛,多使用private,package-private,protected等访问权限。
  • Only talk to your immediate friends(只与直接朋友通信):出现在成员变量,方法的输入输出参数中的类,称为朋友类

代码理解

场景

假设一个IT公司的老总(BOSS),要求项目经理(ProjectManager)汇报一下目前正在开发的所有项目(Project)。我们用JAVA来实现一下。

错误实现

1.创建BOSS类,来要求项目经理汇报项目

package com.principle.demeter.wrong;

import com.principle.demeter.Project;

import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName Boss
 * @Description BOSS类
 * @Author Neal
 * @Date 2019/3/1 15:46
 * @Version 1.0
 */
public class Boss {

    /**
     * 让项目经理汇报项目
     * @param projectManager  项目经理
     */
    public void showMeProject(ProjectManager projectManager) {
        //直接模拟有5个项目
        List projects =  new ArrayList(5);
        projectManager.showProject(projects);
    }
}

2.创建ProjectManager类,来汇报项目

package com.principle.demeter.wrong;

import com.principle.demeter.Project;

import java.util.List;

/**
 * @ClassName ProjectManager
 * @Description  项目经理类
 * @Author Neal
 * @Date 2019/3/1 15:47
 * @Version 1.0
 */
public class ProjectManager {

    /**
     * 展示项目
     * @param projects
     */
    public void showProject(List projects) {

        for(Project project : projects) {
            System.out.println("每个项目的内容是 : " + project);
        }
    }
}

3.项目类 (Project)

package com.principle.demeter;

/**
 * @ClassName Project
 * @Description 项目类
 * @Author Neal
 * @Date 2019/3/1 15:47
 * @Version 1.0
 */
public class Project {
}

我们来看一下类图。

demeter类图1.png

S类 还是ProjectManager类 都依赖了Project。但是我们仔细来看BOSS类发现,Project并不是BOSS的朋友(出现在成员变量,方法的输入输出参数中的类,称为朋友类)。因此Project不应该出现在BOSS类中。这就违背了迪米特法则。

还有一种方法也可以看出,大家可能注意到了,我在代码中把引用也展示了出来,因此我们也可以来看BOSS的引用判断,我们可以看到 import com.principle.demeter.Project;的引用并没有出现在BOSS类的成员变量,方法输入或者返回输出。 这也是判断迪米特法则的一种方式。

既然已经了解的迪米特法则,那么我们正确实现就很easy了。

正确实现

1.修改BOSS类,将Project相关移除。

package com.principle.demeter.right;


/**
 * @ClassName Boss
 * @Description BOSS类
 * @Author Neal
 * @Date 2019/3/1 15:46
 * @Version 1.0
 */
public class Boss {

    /**
     * 让项目经理汇报项目
     * @param projectManager  项目经理
     */
    public void showMeProject(ProjectManager projectManager) {
        projectManager.showProject();
    }
}

2.修改ProjectManager类,使其符合BOSS类的调用。

package com.principle.demeter.right;

import com.principle.demeter.Project;

import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName ProjectManager
 * @Description  项目经理类
 * @Author Neal
 * @Date 2019/3/1 15:47
 * @Version 1.0
 */
public class ProjectManager {

    /**
     * 展示项目
     */
    public void showProject() {
        //直接模拟有5个项目
        List projects =  new ArrayList(5);
        for(Project project : projects) {
            System.out.println("每个项目的内容是 : " + project);
        }
    }
}

我们可以通过引用(import)可以发现,BOSS类完全移除了Project 类。而ProjectManager 与 Project 建立了正确的朋友关系。

我们再来看一下类图。

demeter类图2.png

是不是很清晰呢?

总结

迪米特法则其实很简单,只需要区分哪些是真正的朋友,这样在写程序的过程中,适当的运用迪米特法则,降低类之间的耦合。

你可能感兴趣的:(面向对象设计--迪米特法则(最少知道原则))