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

迪米特法则

原则说明:迪米特法则,也被称为最少知识原则(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
4 评论
    zvedqpseerSogo BrowserWindows 10
    11月30日 回复

    你的文章让我学到了很多技能,非常实用。 https://www.yonboz.com/video/33473.html

    lhmsdwutgfSogo BrowserWindows 10
    11月29日 回复

    《神都仙尊(经典珍藏版)》短片剧高清在线免费观看:https://www.jgz518.com/xingkong/156959.html

    yfugedcanqSogo BrowserWindows 10
    11月29日 回复

    你的文章让我学到了很多技能,非常实用。 https://www.4006400989.com/qyvideo/88836.html

    xtykbbmkkjSogo BrowserWindows 10
    11月25日 回复

    你的文章内容非常用心,让人感动。 https://www.yonboz.com/video/55180.html

# 最近更新

Nginx的proxy_pass指令完全拆解2021-03-21

Nginx配置Jenkins域名访问2021-01-03

设计模式 - 浅谈备忘录模式2020-12-02

设计模式 - 浅谈中介者模式2020-11-23

设计模式 - 浅谈迭代器模式2020-11-02

MySQL5.7 字符集设置2020-10-26

设计模式 - 浅谈状态模式2020-10-23

设计模式 - 浅谈访问者模式2020-10-13

设计模式 - 浅谈观察者模式2020-10-12

设计模式 - 浅谈命令模式2020-09-21