迪米特法则

迪米特法则

文章目录

什么是迪米特法则

迪米特法则(Law of Demeter,LoD)也称为最少知识原则,是一种面向对象的设计原则,其核心思想是:一个对象应该对其他对象有最少的了解。具体来说,一个对象应当只与它的直接朋友(即成员变量、方法的参数、返回值)交流,不与陌生的对象通信。这样做可以降低类之间的耦合度,提高系统的可维护性和可扩展性。
迪米特法则(LoD)也叫最少知识原则
迪米特法则(LoD),如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用
迪米特法则首先强调的前提是在类的结构设计上,每一个类都应当尽量降低成员的访问权限,也就是说,一个类包装好自己的private状态,不需要让别的类知道的字段或行为就不要公开
迪米特法则其根本思想,是强调了类之间的松耦合
我们在程序设计时,类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及。也就是说,信息的隐藏促进了软件的复用

示例

以下是一个使用迪米特法则编写的 Java 示例,以模拟一个简单的图书馆借阅系统。我们将遵循以下原则:

  • 图书馆用户(User)只知道图书(Book)的标题,不知道具体的借阅操作。
  • 用户只知道图书管理员(Librarian),通过管理员进行借书和还书操作。
  • 图书管理员负责管理图书库存(BookInventory),但不知道具体的用户操作。

1. 定义 Book 类:

java 复制代码
public class Book {
    private String title;

    public Book(String title) {
        this.title = title;
    }

    public String getTitle() {
        return title;
    }
}

2. 定义 BookInventory 类:

java 复制代码
import java.util.HashMap;
import java.util.Map;

public class BookInventory {
    private Map<String, Book> books;

    public BookInventory() {
        books = new HashMap<>();
    }

    public void addBook(Book book) {
        books.put(book.getTitle(), book);
    }

    public boolean hasBook(String title) {
        return books.containsKey(title);
    }

    public void removeBook(String title) {
        books.remove(title);
    }

    public Book borrowBook(String title) {
        if (!hasBook(title)) {
            throw new IllegalArgumentException("The book is not available.");
        }
        Book borrowedBook = books.get(title);
        books.remove(title);
        return borrowedBook;
    }

    public void returnBook(Book book) {
        books.put(book.getTitle(), book);
    }
}

3. 定义 Librarian 类:

java 复制代码
public class Librarian {
    private BookInventory inventory;

    public Librarian(BookInventory inventory) {
        this.inventory = inventory;
    }

    public Book borrowBook(String title, User user) {
        Book book = inventory.borrowBook(title);
        user.borrowedBook(book);
        return book;
    }

    public void returnBook(Book book, User user) {
        inventory.returnBook(book);
        user.returnedBook(book);
    }
}

4. 定义 User 类:

java 复制代码
public class User {
    // 借书
    public void borrowedBook(Book book) {
        System.out.println("User borrowed the book: " + book.getTitle());
    }

    // 还书
    public void returnedBook(Book book) {
        System.out.println("User returned the book: " + book.getTitle());
    }
}

5. 客户端代码:

java 复制代码
public class LibraryDemo {
    public static void main(String[] args) {
        BookInventory inventory = new BookInventory();
        inventory.addBook(new Book("Design Patterns"));
        inventory.addBook(new Book("Clean Code"));

        Librarian librarian = new Librarian(inventory);
        User user = new User();

        Book borrowedBook = librarian.borrowBook("Design Patterns", user);
        System.out.println("\n---\n");
        librarian.returnBook(borrowedBook, user);
    }
}

在这个示例中,我们遵循了迪米特法则:

  • 用户只知道图书的标题,不知道具体的借阅操作。
  • 用户通过图书管理员进行借书和还书操作,不直接与图书库存交互。
  • 图书管理员负责管理图书库存,但不知道具体的用户操作。
  • 通过这种方式,各组件之间的耦合度较低,系统更易于维护和扩展。
相关推荐
禁默39 分钟前
深入浅出:AWT的基本组件及其应用
java·开发语言·界面编程
Cachel wood1 小时前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
Code哈哈笑1 小时前
【Java 学习】深度剖析Java多态:从向上转型到向下转型,解锁动态绑定的奥秘,让代码更优雅灵活
java·开发语言·学习
gb42152871 小时前
springboot中Jackson库和jsonpath库的区别和联系。
java·spring boot·后端
程序猿进阶1 小时前
深入解析 Spring WebFlux:原理与应用
java·开发语言·后端·spring·面试·架构·springboot
zfoo-framework1 小时前
【jenkins插件】
java
风_流沙1 小时前
java 对ElasticSearch数据库操作封装工具类(对你是否适用嘞)
java·数据库·elasticsearch
ProtonBase2 小时前
如何从 0 到 1 ,打造全新一代分布式数据架构
java·网络·数据库·数据仓库·分布式·云原生·架构
乐之者v2 小时前
leetCode43.字符串相乘
java·数据结构·算法