设计模式七大原则 - 迪米特法则(最少知道原则)

2022-11-27  本文已影响0人  夹板儿孩

迪米特法则 (最少知道原则)

  1. 迪米特法则又叫最少知道原则,即一个类对自己依赖的类知道的越少越好。不管被依赖的类有多么的复杂,都尽量将逻辑封装在类的内部。除了提供 public 方法以外,不对外泄露其他信息

  2. 迪米特法则只与直接的朋友进行通信

    直接朋友:

    1. 成员变量
    2. 方法参数
    3. 方法返回值

案例

案例需求描述:现在有一个老板、一个领导、十个员工。老板需要十个员工每天喊 “老板好”

public class Boss {
    public void notice() {
        Leader leader = new Leader();   // 应当将 Leader 提升为成员变量
        List<Employee> employees = leader.getEmployees();   // 这里老板直接使用了员工类,员工是老板的下下级,应该由 Leader 来通知
        employees.forEach(employee -> employee.say("老板好"));
    }
}

public class Leader {
    public List<Employee> getEmployees() {
        List<Employee> employees = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            Employee employee = new Employee();
            employee.setId(i + 1);
            employees.add(employee);
        }
        return employees;
    }
}

public class Employee {
    private int id;

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

    public int getId() {
        return id;
    }

    public void say(String str) {
        System.out.println("员工" + this.id + "说: " + str);
    }
}

public class Main {

    public static void main(String[] args) {
        Boss boss = new Boss();
        boss.notice();
    }
}

现在我们针对这个案例使用迪米特法则进行优化

优化思路:老板不需要知道每个员工信息,他也不需要单独对每个员工进行对话,他只需要吩咐给经理就行了。由经理做事情

public class Boss {
    private final Leader leader = new Leader();

    public void notice() {
        leader.notice("老板好");
    }

}

public class Leader {
    public List<Employee> getEmployees() {
        List<Employee> employees = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            Employee employee = new Employee();
            employee.setId(i + 1);
            employees.add(employee);
        }
        return employees;
    }

    public void notice(String str) {
        this.getEmployees().forEach(employee -> employee.say("老板好"));
    }
}

Main 和 Employee 类不需要进行修改

通过迪米特法则优化后可以看出 Boss 与员工没有了直接的接触了

ps: 我对迪米特法则的理解就是,依赖应该有层次,一级只能依赖一级,不能跨级依赖。换个比方就是,老板不需要知道每个员工做什么,只需要管理他的下一级

上一篇 下一篇

猜你喜欢

热点阅读