迪米特法则

迪米特法则

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);
    }
}

posted @   Allure小新  阅读(96)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示