[设计模式] 浅谈迪米特法则

2024 年 4 月 17 日 星期三
/ ,
12

阅读此文章之前,你可能需要首先阅读以下的文章才能更好的理解上下文。

迪米特法则

原则说明:迪米特法则,也被称为最少知识原则(Least Knowledge Principle),一个对象应该对其他对象有最少的了解。通俗的讲,一个类应该对自己需要耦合或调用的类知道的越少越好。

为什么要遵守该原则

该原则是为了让使系统降低类之间的耦合度,提高模块的相对独立性。

用一个简单的例子说明

假设我们要去逛商场,去店铺里面买东西,通过代码实现:

// 顾客类
public class Customer {
    private String name;

    public Customer(String name) {
        this.name = name;
    }

    public void shopping(Shop shop) {
        System.out.println(name + "开始在商店购物");
        shop.sellGoods();
    }
}

// 商店类
public class Shop {
    private String goods;

    public Shop() {
        this.goods = "商品";
    }

    public void sellGoods() {
        System.out.println("商店销售" + goods);
    }
}

// 主函数
public class Main {
    public static void main(String[] args) {
        Customer customer = new Customer("张三");
        Shop shop = new Shop();
        customer.shopping(shop);
    }
}

上面的代码错误的让顾客直接与商店交互,而不是通过商场。这样就破坏了迪米特法则。
正确的做法应该是顾客只需要知道商场可以提供商品,而不需要知道商场是如何提供商品的,也不需要知道商场内部的商店是如何销售商品的。

// 顾客类
public class Customer {
    private String name;

    public Customer(String name) {
        this.name = name;
    }

    public void shopping(ShoppingMall shoppingMall) {
        System.out.println(name + "开始在商场购物");
        shoppingMall.provideGoods();
    }
}

// 商场类
public class ShoppingMall {
    private Shop shop;

    public ShoppingMall() {
        this.shop = new Shop();
    }

    public void provideGoods() {
        shop.sellGoods();
    }
}

// 商店类
public class Shop {
    private String goods;

    public Shop() {
        this.goods = "商品";
    }

    public void sellGoods() {
        System.out.println("商店销售" + goods);
    }
}

// 主函数
public class Main {
    public static void main(String[] args) {
        Customer customer = new Customer("张三");
        ShoppingMall shoppingMall = new ShoppingMall();
        customer.shopping(shoppingMall);
    }
}

总结

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

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...