当前位置: 首页 > news >正文

超详细超实用!!!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 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 不需要改变。这提高了系统的灵活性和可维护性。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【高级数据结构】树状数组
  • 时间序列分析算法
  • srm供应商管理系统排名 6款好用的SRM系统推荐
  • 基于51单片机的两路电压检测(ADC0808)
  • 第二章 SQL语言简介
  • 5分钟内不能重复发送验证码!
  • 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-24
  • 速盾:凡科建站开cdn了吗?
  • Android 短信验证码自动填充
  • Python实现回归分析
  • QT事件过滤器(1)
  • <刷题笔记> 二叉搜索树与双向链表注意事项
  • 【AI写作】解释区块链技术的应用场景和优势
  • 【Git入门】使用 Git 进行项目管理:Word Count 程序开发与托管
  • 408算法题leetcode--第14天
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • angular学习第一篇-----环境搭建
  • ES学习笔记(12)--Symbol
  • HTML中设置input等文本框为不可操作
  • input的行数自动增减
  • Java程序员幽默爆笑锦集
  • Leetcode 27 Remove Element
  • LeetCode18.四数之和 JavaScript
  • MySQL-事务管理(基础)
  • Python打包系统简单入门
  • TypeScript迭代器
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 三分钟教你同步 Visual Studio Code 设置
  • 使用SAX解析XML
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • ionic入门之数据绑定显示-1
  • 阿里云ACE认证之理解CDN技术
  • 正则表达式-基础知识Review
  • ​TypeScript都不会用,也敢说会前端?
  • ​必胜客礼品卡回收多少钱,回收平台哪家好
  • # C++之functional库用法整理
  • # 计算机视觉入门
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #QT项目实战(天气预报)
  • $NOIp2018$劝退记
  • (1)Android开发优化---------UI优化
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (C11) 泛型表达式
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第1节 (全局数据、栈和堆)
  • (done) 两个矩阵 “相似” 是什么意思?
  • (zt)最盛行的警世狂言(爆笑)
  • (八十八)VFL语言初步 - 实现布局
  • (精确度,召回率,真阳性,假阳性)ACC、敏感性、特异性等 ROC指标
  • (十六)一篇文章学会Java的常用API
  • (十七)Flink 容错机制
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)linux下的时间函数使用
  • (转)负载均衡,回话保持,cookie
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net CHARTING图表控件下载地址