云风网
云风笔记
云风知识库
一、设计模式迪米特法则定义
只与你的直接朋友交谈,不跟“陌生人”说话
其含义是:如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。
迪米特法则中的“朋友”是指:当前对象本身、当前对象的成员对象、当前对象所创建的对象、当前对象的方法参数等,这些对象同当前对象存在关联、聚合或组合关系,可以直接访问这些对象的方法。
二 、原则作用
- 迪米特法则要求限制软件实体之间通信的宽度和深度。
- 降低了类之间的耦合度,提高了模块的相对独立性。 由于亲合度降低,从而提高了类的可复用率和系统的扩展性。
- 但是,过度使用迪米特法则会使系统产生大量的中介类,从而增加系统的复杂性,使模块之间的通信效率降低。所以,在釆用迪米特法则时需要反复权衡,确保高内聚和低耦合的同时,保证系统的结构清晰。
三、原则实现实例
从迪米特法则的定义和特点可知,它强调以下两点:
从依赖者的角度来说,只依赖应该依赖的对象。
从被依赖者的角度说,只暴露应该暴露的方法。
所以,在运用迪米特法则时要注意以下六点。
- 在类的划分上,应该创建弱耦合的类。类与类之间的耦合越弱,就越有利于实现可复用的目标。
- 在类的结构设计上,尽量降低类成员的访问权限。
- 在类的设计上,优先考虑将一个类设置成不变类。
- 在对其他类的引用上,将引用其他对象的次数降到最低。
- 不暴露类的属性成员,而应该提供相应的访问器(set 和 get 方法)。
- 谨慎使用序列化(Serializable)功能。
1、新建main.java空白文件,cursor输入指令
2、自动生成代码以及文件
2.1、Main.java代码如下:
public class Main {
public static void main(String[] args) {
LibrarySystem library = new LibrarySystem();
// Adding books to the catalog
library.addBookToCatalog(new Book("The Great Gatsby", "F. Scott Fitzgerald"));
library.addBookToCatalog(new Book("To Kill a Mockingbird", "Harper Lee"));
library.addBookToCatalog(new Book("1984", "George Orwell"));
System.out.println("\n--- Library Transactions ---");
// Creating library members
LibraryMember member1 = new LibraryMember("Alice", 1001);
LibraryMember member2 = new LibraryMember("Bob", 1002);
// Borrowing books
library.borrowBook(member1, "The Great Gatsby");
library.borrowBook(member2, "1984");
library.borrowBook(member1, "Moby Dick");
}
}
2.2、LibrarySystem.java代码如下:
LibrarySystem 类只与 Catalog、Book 和 LibraryMember 直接交互,而不需要了解这些类的内部实现细节。
public class LibrarySystem {
private Catalog catalog;
public LibrarySystem() {
this.catalog = new Catalog();
}
public void addBookToCatalog(Book book) {
catalog.addBook(book);
System.out.println("Added book: " + book.getTitle() + " by " + book.getAuthor());
}
public void borrowBook(LibraryMember member, String bookTitle) {
if (catalog.isBookAvailable(bookTitle)) {
Book book = catalog.findBook(bookTitle);
System.out.println(member.getName() + " (ID: " + member.getMemberId() + ") borrowed: " + book.getTitle());
} else {
System.out.println("Sorry, " + bookTitle + " is not available.");
}
}
}
2.3、LibraryMember.java代码如下:
public class LibraryMember {
private String name;
private int memberId;
public LibraryMember(String name, int memberId) {
this.name = name;
this.memberId = memberId;
}
public String getName() {
return name;
}
public int getMemberId() {
return memberId;
}
}
2.4、Catalog.java代码如下:
Catalog 类封装了对书籍的管理,LibrarySystem 不需要直接操作书籍列表。
import java.util.ArrayList;
import java.util.List;
public class Catalog {
private List<Book> books = new ArrayList<>();
public void addBook(Book book) {
books.add(book);
}
public boolean isBookAvailable(String title) {
return books.stream().anyMatch(book -> book.getTitle().equals(title));
}
public Book findBook(String title) {
return books.stream()
.filter(book -> book.getTitle().equals(title))
.findFirst()
.orElse(null);
}
}
2.5、Book .java代码如下:
public class Book {
private String title;
private String author;
public Book(String title, String author) {
this.title = title;
this.author = author;
}
public String getTitle() {
return title;
}
public String getAuthor() {
return author;
}
}
3、运行主程序输出
这个输出直观地展示了图书馆系统的运作,同时遵循了迪米特法则。每个类只与其直接相关的类交互,减少了类之间的耦合。例如,LibrarySystem 不需要知道 Catalog 是如何存储和查找书籍的,它只需要调用相应的方法即可。
通过这种方式,如果 Catalog 类的实现发生变化(比如改变存储方式),只需要修改 Catalog 类本身,而 LibrarySystem 不需要改变。这提高了系统的灵活性和可维护性。