首页 > 其他 > 详细

迪米特法则

时间:2021-05-17 00:37:59      阅读:29      评论:0      收藏:0      [点我收藏+]

迪米特法则

Demeter Principle

  • 一个对象应该对其他对象保持最少的了解

  • 类与类关系越密切,耦合度越大

  • 迪米特法则(Demeter Principle)又叫最少知道原则,即一个类对自己依赖的类知道的 越少越好。也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内 部。对外除了提供的public 方法,不对外泄露任何信息

  • 迪米特法则还有个更简单的定义:只与直接的朋友通信

    • 直接朋友:每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系, 我们就说这两个对象之间是朋友关系。耦合的方式很多,依赖,关联,组合,聚合 等。其中,我们称出现成员变量,方法参数,方法返回值中的类为直接的朋友,而 出现在局部变量中的类不是直接的朋友。也就是说,陌生的类最好不要以局部变量 的形式出现在类的内部
  • 迪米特法则的核心是降低类之间的耦合

  • 但是注意:由于每个类都减少了不必要的依赖,因此迪米特法则只是要求降低 类间(对象间)耦合关系, 并不是要求完全没有依赖关系

package com.xin.principle;

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

//迪米特法则
public class DiMit {
    public static void main(String[] args) {
        //获取腾讯所有员工的id
        TencentEmpManager tencentEmpManager = new TencentEmpManager();
        tencentEmpManager.printAllEmp(new QQEmpManager());
    }
}

//腾讯员工类
class TencentEmp {
    private Integer id;

    public Integer getId() {
        return id;
    }

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

    @Override
    public String toString() {
        return "TencentEmp{" +
                "id=" + id +
                ‘}‘;
    }
}
//qq员工类
class QQEmp {
    private Integer id;

    public Integer getId() {
        return id;
    }

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

    @Override
    public String toString() {
        return "QQEmp{" +
                "id=" + id +
                ‘}‘;
    }
}

//腾讯员工管理类
/*
    对于这一个类来说,它的直接朋友是,TencentEmp,qqEmpManager
 */
class TencentEmpManager {
    //获取到员工
    public List<TencentEmp> getTencentEmp() {
        List<TencentEmp> list = new ArrayList<TencentEmp>();
        for (int i = 0; i < 5; i++) {
            TencentEmp emp = new TencentEmp();
            emp.setId(i);
            list.add(emp);
        }
        return list;
    }

    //打印出所有员工的方法
    void printAllEmp(QQEmpManager qqEmpManager) {
        //打印腾讯的员工
        List<TencentEmp> tencentEmps = this.getTencentEmp();
        tencentEmps.stream().forEach(System.out::println);

        //打印qq的员工
        /*
            迪米特法则:要求只与直接朋友腾讯,而在这一个类中QQEmp不是直接朋友,而是一个陌生的类
            所以这里违背了迪米特法则
         */
//        List<QQEmp> qqEmps = qqEmpManager.getQQEmp();
//        qqEmps.stream().forEach(System.out::println);

        //为了满足迪米特法则,这里获取qq员工的id,使用qq员工管理方法提供的方法来获取
        qqEmpManager.printQQ();
    }
}

//qq员工管理类
class QQEmpManager {
    //获取到员工
    public List<QQEmp> getQQEmp() {
        List<QQEmp> list = new ArrayList<QQEmp>();
        for (int i = 0; i < 3; i++) {
            QQEmp qqEmp = new QQEmp();
            qqEmp.setId(i);
            list.add(qqEmp);
        }
        return list;
    }

    //打印qq员工id的方法
    /*
        满足迪米特法则的规范
        对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内 部。对外除了提供的public 方法,不对外泄露任何信息
     */
    public void printQQ() {
        List<QQEmp> qqEmps = this.getQQEmp();
        qqEmps.stream().forEach(System.out::println);
    }
}

迪米特法则

原文:https://www.cnblogs.com/allure-xiaoxin/p/14774609.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!