【编码魔法师系列_六大原则5】迪米特原则(Law of Demeter Principle)

【编码魔法师系列_六大原则5】迪米特原则(Law of Demeter Principle)_第1张图片

学会设计模式,你就可以像拥有魔法一样,在开发过程中解决一些复杂的问题。设计模式是由经验丰富的开发者们(GoF)凝聚出来的最佳实践,可以提高代码的可读性、可维护性和可重用性,从而让我们的开发效率更高。通过不断的练习和实践,掌握其中的奥妙,选择合适的设计模式,能为我们的项目增加一丝神奇的魔力。

文章目录

  • 定义
  • 例子
  • Coding
  • 测试
  • 测试结果
  • 优点
  • 缺点

定义

一个对象应该对其他对象保持最少的了解,使得系统功能模块相对独立。
即一个类作为一个调用方,应当对自己依赖的类(被调用的类)其中所处理的逻辑细节,知道的越少越好。

例子

食客到饭点通过服务员点餐,服务员通知厨师做菜

Coding

我们先定义一个类与类之间的关系:

  • 如果被调用类调用类中作为:成员变量的类型、方法参数类型、方法返回值类型,那么我们称被调用类和调用类是“朋友”关系
  • 如果被调用类调用类中仅作为:局部变量,那么我们称被调用类和调用类是“陌生人”关系

食客类:
食客吃饭,无需关心厨师如何烹饪菜肴。所以食客和服务员是朋友,和厨师是陌生人

public class Diner {
    public void order(Waiter waiter, String tableNumber, String dishName) {
        waiter.passDish(tableNumber, dishName);
    }
}

食客类中,因为入参中有Waiter类,所以Waiter和Diner是朋友

服务员类:

public class Waiter {
    public Chef notice(String tableNumber) {
        System.out.println("服务员接到" + tableNumber + "号桌点菜");
        Chef chef = new Chef();
        return chef;
    }

    public void passDish(String tableNumbe, String dishName) {
        String cooking = notice(tableNumbe).cooking(dishName);
        System.out.println(cooking);
        System.out.println("服务员传菜");
    }
}

服务员类中,notice方法返回值类型是Chef,所以服务员和厨师是朋友

注:类与类之间的耦合是不可避免的,遵循迪米特法则并不是完全解除依赖,而是在一定程度上降低类与类之间不必要的依赖。

厨师类:

public class Chef {
    public String cooking(String dishName) {
        return "厨师烹饪" + dishName;
    }
}

测试

@Test
public void test() {
    Diner diner = new Diner();
    Waiter waiter = new Waiter();
    diner.order(waiter, "11", "宫保鸡丁");
}

测试结果

服务员接到11号桌点菜
厨师烹饪宫保鸡丁
服务员传菜

我们只能尽量的不要让「陌生人」作为局部变量出现在类的内部,并且保障类对自己依赖的类知道的越少越好。

优点

1、降低了类之间的耦合度,提高了模块的相对独立性。
2、提高类的可复用率和系统的扩展性。

缺点

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

文章后期会持续优化,如果觉得小名的文章帮助到了您,请关注小名,支持一下小名,给小名的文章点赞、评论✍、收藏谢谢大家啦~♥♥♥
编码魔法师系列文章,会收录在小名的【设计模式】专栏中,希望大家可以持续关注

你可能感兴趣的:(设计模式,java,开发语言,迪米特法则,设计模式,后端,程序人生)