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

devtools/2024/10/18 5:42:43/

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

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

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

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

二 、原则作用

  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 cataloglibrary.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 membersLibraryMember member1 = new LibraryMember("Alice", 1001);LibraryMember member2 = new LibraryMember("Bob", 1002);// Borrowing bookslibrary.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 不需要改变。这提高了系统的灵活性和可维护性。


http://www.ppmy.cn/devtools/119813.html

相关文章

高防IP能够运用在哪些场景当中?

随着互联网技术的快速发展&#xff0c;网络安全成为企业经常需要面对的问题&#xff0c;在日常生活中分布式拒绝服务攻击与CC攻击是常见的网络攻击类型&#xff0c;同时DDOS攻击对于企业和服务提供商造成了严重的损失&#xff0c;而高防IP作为一种有效的安全防护手段&#xff0…

flume系列之:flume jmx页面导出flume、java进程等全部指标

flume系列之:flume jmx页面导出flume、java进程等全部指标 一、需求背景二、完整的jmx指标信息三、修改jmx指标导出规则四、启动jmx导出程序一、需求背景 目前jmx页面指标只导出了flume相关的指标,现在需要导出java相关的指标二、完整的jmx指标信息 主要有flume指标java进程指…

GO Serial 学习与使用

文章目录 主要特性安装基本用法配置选项错误处理其他功能 github.com/goburrow/serial 是一个 Go 包&#xff0c;提供了一种简单的方式来与串口进行交互。以下是该包的主要特性和用法的简要概述&#xff1a; 主要特性 跨平台支持&#xff1a;支持 Windows、macOS 和 Linux。简…

基于php的在线租房管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

《黑神话:悟空》在全球爆火的原因是什么?

以下将《黑神话&#xff1a;悟空》简称为《悟空》。 遥想当年&#xff0c;PC国产单机游戏蒸蒸日上之时&#xff0c;盗版光碟的猖獗&#xff0c;逼得正版游戏厂商要么倒闭&#xff0c;要么为了存活&#xff0c;转型开发网络游戏&#xff0c;要么索性转成其它行业&#xff0c;国产…

鸿蒙NEXT开发-ArkTS(基于最新api12稳定版)

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

八,MyBatis-Plus 的“多数据源”的连接操作(详细说明)

八&#xff0c;MyBatis-Plus 的“多数据源”的连接操作&#xff08;详细说明&#xff09; 文章目录 八&#xff0c;MyBatis-Plus 的“多数据源”的连接操作&#xff08;详细说明&#xff09;最后&#xff1a; 在学习多数据源之前&#xff0c;我们先来了解一下分库分表 当一个项…

C++中set集合和Python中set集合的区别

C 和 Python 中的 set 容器都有相同的集合属性&#xff1a;元素唯一性和常规的集合操作&#xff08;如交集、并集、差集等&#xff09;&#xff0c;但由于它们的实现机制、操作方法和性能特性有所不同&#xff0c;适用场景也存在差异。以下是两者的主要区别&#xff1a; 1. 底…