天天看点

什么是迪米特法则?了解这个原则,优化你的面向对象编程!

作者:T锅侠
什么是迪米特法则?了解这个原则,优化你的面向对象编程!

迪米特法则(Law of Demeter,LoD)又称最少知识原则(Least Knowledge Principle,LKP),是一种面向对象编程设计原则,其核心思想是一个对象应该对其他对象保持最少的了解。迪米特法则要求一个对象应该仅与其直接关联的对象进行交互,而不是与间接关联的对象进行交互。这有助于降低系统的复杂性,提高模块的独立性,使代码更易于维护和扩展。

以下是5个迪米特法则的具体例子及其伪代码:

例子1:

一个班级有学生和老师,老师需要知道学生的总数。在这种情况下,老师只需要与班级对象交互,而不需要与每个学生对象交互。

什么是迪米特法则?了解这个原则,优化你的面向对象编程!

伪代码:

class Student {
}

class Classroom {
    List<Student> students;

    int getStudentCount() {
        return students.size();
    }
}

class Teacher {
    void printStudentCount(Classroom classroom) {
        print(classroom.getStudentCount());
    }
}

           

例子2:

一个购物车系统,顾客可以购买商品。顾客不需要知道库存的具体细节,只需要知道商品是否可用。

什么是迪米特法则?了解这个原则,优化你的面向对象编程!

伪代码:

class Product {
    boolean isAvailable() {
        // Check availability
    }
}

class Customer {
    void buyProduct(Product product) {
        if (product.isAvailable()) {
            // Purchase product
        }
    }
}

           

例子3:

一个餐厅,顾客可以点餐。顾客不需要知道厨师如何制作菜肴,只需要知道菜单上的菜品。

什么是迪米特法则?了解这个原则,优化你的面向对象编程!

伪代码:

class Dish {
}

class Menu {
    List<Dish> dishes;
}

class Chef {
    void cookDish(Dish dish) {
        // Cook the dish
    }
}

class Customer {
    void orderDish(Menu menu, Chef chef) {
        Dish dish = menu.selectDish();
        chef.cookDish(dish);
    }
}

           

例子4:

一个电影院,顾客可以购买电影票。顾客不需要知道如何打印电影票,只需要知道购票窗口。

什么是迪米特法则?了解这个原则,优化你的面向对象编程!

伪代码:

class Ticket {
}

class TicketBooth {
    Ticket printTicket() {
        // Print ticket
    }
}

class Customer {
    void buyTicket(TicketBooth ticketBooth) {
        Ticket ticket = ticketBooth.printTicket();
    }
}

           

例子5:

一个图书馆,读者可以借阅图书。读者不需要知道如何管理图书,只需要知道如何查找和借阅图书。

什么是迪米特法则?了解这个原则,优化你的面向对象编程!

伪代码:

class Book {
}

class Library {
    List<Book> books;

    Book findBook(String title) {
        // Find book by title
    }

    void lendBook(Book book) {
        // Lend book
    }
}

class Reader {
    void borrowBook(Library library, String title) {
        Book book = library.findBook(title);
        library.lendBook(book);
    }
}