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

server/2024/10/15 22:23:26/

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

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

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

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

二 、原则作用

  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/server/124876.html

相关文章

一款以MM32SPIN0230为核的智能功率模块

MM32SPIN0230是一款极具竞争力的高性价比单电机控制MCU&#xff0c;搭载Cortex-M0内核&#xff0c;32KB Flash、4KB SRAM&#xff0c;集成了运动控制所需的12位高精度ADC、2路模拟比较器COMP和2路运算放大器OPAMP&#xff0c;另配备有MC-TIM、硬件除法器HW-Div、DMA控制器等专用…

常用大语言模型简单介绍

LLaMA&#xff08;Large Language Model Meta AI&#xff09;和 Qwen是两个不同的大语言模型&#xff0c;它们在开发背景、设计目标和使用场景等方面有所不同。 1. LLaMA: 开发背景: LLaMA 是由Facebook开发的大语言模型&#xff0c;主要针对学术研究和开源领域。它的设计初衷…

微信小程序 蓝牙通讯

客户的需求如下&#xff1a;通过微信小程序控制蓝牙ble设备(电子面膜)&#xff0c;通过不同指令控制面膜的亮度和时间。 01.首先看下客户的ble设备服务文档&#xff1a;(本部分需要有点蓝牙基础,在调试过程中可以用安卓软件nRF Connect软件来执行测试命令) 0xFFF1灯控命令 命…

Git 工作区、暂存区和版本库

Git 工作区、暂存区和版本库 Git 是一个强大的版本控制系统&#xff0c;它帮助开发者管理代码历史&#xff0c;协作开发&#xff0c;以及跟踪和合并更改。为了更好地理解 Git 的工作流程&#xff0c;我们需要了解 Git 中的三个核心概念&#xff1a;工作区&#xff08;Workspac…

俄罗斯市场合格评定准入认证要求

前言 国内厂家想要把自己的产品顺利出口到俄罗斯市场&#xff0c;就需要基本了解俄罗斯的市场合格评定准入要求。俄罗斯主要实行的认证有EAC(TR-CU/CU-TR)认证、GOST R认证、计量认证和医疗产品国家注册。下面就分别简单介绍一下这几个产品认证。 一、EAC(TR-CU/CU-TR)认证介绍…

开源链动 2+1 模式 S2B2C 商城小程序:激活 KOC,开启商业新征程

摘要&#xff1a;本文深入探讨了 KOC 在立体连接中的重要性&#xff0c;以及如何通过开源链动 21 模式 S2B2C 商城小程序发现和找到更多的 KOC。强调了历史积累强关系和快速强化强关系的方法&#xff0c;并阐述了该商城小程序在推动商业发展中的关键作用。 一、引言 在当今竞争…

如何给文件夹里面的文件批量添加前缀和编号(利用C#写的小工具)

运行结果 将上面的文件编号效果 下载过后启动这个程序即可&#xff08;这个程序灵感来源是上次给美术资源分类和编号的时候给我干吐了&#xff0c;所以写了这个工具&#xff09; 体验链接&#xff1a;laozhupeiqia/批处理 --- laozhupeiqia/批处理 (github.com) 如果对你有帮助…

通信工程学习:什么是MAI多址干扰

MAI:多址干扰 MAI多址干扰(Multiple Access Interference)是无线通信领域,特别是在码分多址(CDMA)系统中,一个关键的干扰现象。以下是对MAI多址干扰的详细解释: 一、定义 多址干扰是指在CDMA系统中,由于多个用户的信号在时域和频域上是混叠的,从而导…