超详细超实用!!!AI编程之cursor编写设计模式迪米特法则实例(八)

云风网
云风笔记
云风知识库

一、设计模式迪米特法则定义

只与你的直接朋友交谈,不跟“陌生人”说话
其含义是:如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。

迪米特法则中的“朋友”是指:当前对象本身、当前对象的成员对象、当前对象所创建的对象、当前对象的方法参数等,这些对象同当前对象存在关联、聚合或组合关系,可以直接访问这些对象的方法。

二 、原则作用

  1. 迪米特法则要求限制软件实体之间通信的宽度和深度。
  2. 降低了类之间的耦合度,提高了模块的相对独立性。 由于亲合度降低,从而提高了类的可复用率和系统的扩展性。
  3. 但是,过度使用迪米特法则会使系统产生大量的中介类,从而增加系统的复杂性,使模块之间的通信效率降低。所以,在釆用迪米特法则时需要反复权衡,确保高内聚和低耦合的同时,保证系统的结构清晰。

三、原则实现实例

从迪米特法则的定义和特点可知,它强调以下两点:

从依赖者的角度来说,只依赖应该依赖的对象。

从被依赖者的角度说,只暴露应该暴露的方法。

所以,在运用迪米特法则时要注意以下六点。

  1. 在类的划分上,应该创建弱耦合的类。类与类之间的耦合越弱,就越有利于实现可复用的目标。
  2. 在类的结构设计上,尽量降低类成员的访问权限。
  3. 在类的设计上,优先考虑将一个类设置成不变类。
  4. 在对其他类的引用上,将引用其他对象的次数降到最低。
  5. 不暴露类的属性成员,而应该提供相应的访问器(set 和 get 方法)。
  6. 谨慎使用序列化(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 不需要改变。这提高了系统的灵活性和可维护性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

niech_cn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值