迪米特法则 (Law of Demeter)

迪米特法则(Law of Demeter)提倡类之间的低耦合和高内聚,强调只与直接的朋友通信。文章通过一个公司打印员工信息的例子,展示了如何遵循这一原则,将打印方法从`Company`类移到`Manager`类中,减少`Employee`类作为局部变量的使用。然而,过度使用可能导致系统复杂性和通信效率的增加。因此,在实际应用中需要平衡设计原则与系统复杂度之间的关系。
摘要由CSDN通过智能技术生成

迪米特法则 (Law of Demeter)

定义:如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。
  • 迪米特法则(Law of Demeter)又叫作最少知识原则(The Least Knowledge Principle),通俗的来讲,就是一个类对自己依赖的类知道的越少越好。也就是说,对于被依赖的类来说,无论逻辑多么复杂,都尽量地的将逻辑封装在类的内部,对外除了提供的public方法,不对外泄漏任何信息。

  • 迪米特法则还有一个更简单的定义:只与直接的朋友通信。首先来解释一下什么是直接的朋友:我们称出现成员变量、方法参数、方法返回值中的类为直接的朋友,而出现在局部变量中的类则不是直接的朋友。也就是说,陌生的类最好不要作为局部变量的形式出现在类的内部。

  • 例子:公司要打印某部门的人员信息,代码如下;

/**
 * 雇员
 */
public class Employee {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
/**
 * 部门经理
 */
public class Manager {
    public List<Employee> getEmployees(String department) {
        List<Employee> employees = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            Employee employee = new Employee();
            // 雇员姓名
            employee.setName(department + i);
            employees.add(employee);
        }
        return employees;
    }
}
/**
 * 公司
 */
public class Company {
	private Manager manager = new Manager();

    public void printEmployee(String name){
        List<Employee> employees = manager.getEmployees(name);
        for (Employee employee : employees) {
            System.out.print(employee.getName() + ";");
        }
    }
}

Company 类中的 printEmployee 确实成功打印了人员信息,但是 Employee 类只作为局部变量出现在 printEmployee() 方法中,为 Company 类的间接朋友,违背了迪米特法则(只与直接的朋友通信)

  • 正确做法如下:将 Company 类中打印雇员信息的方法放在 Manager 类中,Company 中只调用 Manager 中 printEmployee() 方法即可,Employee 类不再 Company 类中出现
/**
 * 雇员
 */
public class Employee {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
/**
 * 部门经理
 */
public class Manager {
    public List<Employee> getEmployees(String department) {
        List<Employee> employees = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            Employee employee = new Employee();
            // 雇员姓名
            employee.setName(department + i);
            employees.add(employee);
        }
        return employees;
    }

    public void printEmployee(String name){
        List<Employee> employees = this.getEmployees(name);
        for (Employee employee : employees) {
            System.out.print(employee.getName() + ";");
        }
    }
}
/**
 * 公司
 */
public class Company {
    private Manager manager = new Manager();

    public void printEmployee(String name){
        manager.printEmployee(name);
    }
}

但是,过度使用迪米特法则会使系统产生大量的中介类,从而增加系统的复杂性,使模块之间的通信效率降低。所以,在釆用迪米特法则时需要反复权衡,确保高内聚和低耦合的同时,保证系统的结构清晰。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值