设计模式 - 浅谈迪米特法则

迪米特法则

原则说明:迪米特法则,也被称为最少知识原则(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);
    }
}

总结

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

本文链接:

https://pugqq.com/archives/demeters-law.html
设计模式 - 浅谈迪米特法则 - I/O
快来做第一个评论的人吧~

# 最近更新

JDK国内镜像加速下载2023-05-02

博客评论系统增加悄悄话/匿名留言模式2023-04-10

博客评论系统引入极验api2023-03-22

博客评论系统表情栏优化2023-02-04

centos用firewalld开放端口2022-08-12

数据结构与算法之红黑树2022-03-12

数据结构与算法之字典树2022-03-02

数据结构与算法之LSM树2022-02-24

数据结构与算法之B+树2022-02-15

数据结构与算法之堆2022-02-12