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

news2024/11/21 1:30: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 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 不需要改变。这提高了系统的灵活性和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2177008.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

leetcode面试题 03.04. 化栈为队

实现一个MyQueue类&#xff0c;该类用两个栈来实现一个队列。 示例&#xff1a; MyQueue queue new MyQueue();queue.push(1); queue.push(2); queue.peek(); // 返回 1 queue.pop(); // 返回 1 queue.empty(); // 返回 false 说明&#xff1a; 你只能使用标准的栈操作 -…

SpringBoot学习笔记(2)

1.静态文件访问 使用IDEA创建Spring Boot项目&#xff0c;会默认创建出classpath:/static/目录&#xff0c;静态资源一般放在这个目录下即可。 如果默认的静态资源过滤策略不能满足开发需求&#xff0c;也可以自定义静态资源过滤策略。 1.1直接访问 在application.properties中…

在线远程考试|基于springBoot的在线远程考试系统设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书&#xff08;可指定任意题目&#xff09; 目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取 一、摘要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突…

增强免疫力的9种食物,秋冬尤其要多吃,营养美味又健康!

随着秋风渐起&#xff0c;冬日的脚步也越来越近&#xff01;这时候&#xff0c;咱们的身体可是需要更多的关爱和呵护。说到秋冬养生&#xff0c;增强免疫力是头等大事。今天就来跟大家聊聊&#xff0c;那些既营养美味&#xff0c;又能帮我们提升免疫力的9种超级食物&#xff0c…

关于将inet引入的相关问题

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…

Android 简单实现联系人列表+字母索引效果

效果如上图。 Main Ideas 左右两个列表左列表展示人员数据&#xff0c;含有姓氏首字母的 header item右列表是一个全由姓氏首字母组成的索引列表&#xff0c;点击某个item&#xff0c;展示一个气泡组件(它会自动延时关闭)&#xff0c; 左列表滚动并显示与点击的索引列表item …

UDS_1_基础知识

一. 概述 什么是UDS UDS: Unified Diagnostic Service, 统一诊断服务。 UDS是一个在整个汽车系统上经常使用的设备维护协议。其主要遵循:ISO-15765、ISO-14229 等协议。经常应用在整车的各种ECU上面。是一个在整车ECU应用层开发常用的协议之一。 UDS用途: 可以通过诊断…

【Python基础(二)】面向对象

学习分享 1、初始对象1.1、类的定义和使用1.2、类的私有成员和方法1.3、类的构造方法 2、继承的实现和属性的使用 1、初始对象 1.1、类的定义和使用 1.2、类的私有成员和方法 class Clock:id Noneprice Nonedef ring(self):import winsoundwinsound.Beep(2000,3000)clock Clo…

走近Z世代——感受约克VRF天氟地水中央空调营造的多重舒适体验

“我对于约克VRF中央空调最满意之处,就在于这个品牌对用户体验的极致追求。”来自浙江绍兴的范先生,在提到自家安装的约克VRF天氟地水中央空调时发出了如此感慨。作为“Z世代”的一员,年轻的范先生与所有95后年轻人一样,有着自身的独特审美需求,有对潮流的想法和坚持,更有着生活…

被问界/理想赶超!奔驰CEO再度“出马”,寻找中国外援

来自中国车企的全方位、持续施压&#xff0c;让大部分外资车企开始寻求更多的本地化合作来实现技术升级。传统豪华品牌也同样如此。 本周&#xff0c;知情人士透露&#xff0c;梅赛德斯奔驰首席执行官Ola Kllenius计划再次访问中国&#xff0c;目的是进一步寻求和扩大与本地技术…

矩阵系统源码搭建,OEM贴牌,源头技术开发

一、引言 矩阵系统在当今的数字化时代中发挥着重要的作用&#xff0c;无论是在社交媒体管理、内容分发还是数据分析等方面&#xff0c;都有着广泛的应用。本文将详细介绍矩阵系统源码搭建所需准备的内容&#xff0c;帮助开发者更好地理解和实施矩阵系统的搭建过程。 二、技术选…

集合框架 - Map双列集合

01 概述 02 常用方法 03 遍历方式 【快捷键】&#xff1a;ctrlaltv 【说明】&#xff1a;Map.Entry<xx,xx>中&#xff0c;Entry是Map集合中的一个接口&#xff0c;但接口是不能创建对象的&#xff0c;它底层是通过使用Entry的实现类对象来封装键值对数据的。 【说明】&a…

Transformer架构分析

1 encoder 每个称之为一个layer&#xff0c;重复N次 每个里面有两个sublayer&#xff1b;multi-head self-attention MLP后面使用layer normalization LayerNorm(x Sublayer(x)) 残差连接需要两个维度一致&#xff0c;本文采用513。 2 decoder 3 注意力机制 输出维度和val…

华为OD机试 - 匿名信(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

测试管理新增视图与高级搜索功能,测试计划支持一键生成缺陷详情,MeterSphere开源持续测试工具v3.3版本发布

2024年9月29日&#xff0c;MeterSphere开源持续测试工具正式发布v3.3版本。 在这一版本中&#xff0c;接口测试方面&#xff0c;接口导入功能支持导入Postman、JMX、HAR和MeterSphere格式的文件&#xff0c;接口场景的自定义请求步骤支持cURL快捷导入&#xff1b;测试管理方面…

大数据实时数仓Hologres(一):Hologres 简单介绍

文章目录 Hologres 简单介绍 一、什么是实时数仓 Hologres 二、产品优势 1、专注实时场景 2、亚秒级交互式分析 3、统一数据服务出口 4、开放生态 5、MaxCompute查询加速 6、计算存储分离架构 三、应用场景 搭建实时数仓 四、产品架构 1、Shared Disk/Storage &am…

sql注入工具升级:自动化时间盲注、布尔盲注

项目地址&#xff1a;https://github.com/iamnotamaster/sql-injecter 给我之前写的sql注入脚本进行了一些升级&#xff0c;此文章就是对升级内容的分析&#xff0c;升级内容如下&#xff1a; 使用占位符foo来填充payload里需要经常修改的部分 自动判断循环 支持爆破和二分查…

UE4_Niagara基础实例—6、蓝图与粒子系统的通信

效果图&#xff1a; 分析&#xff1a; 通过键盘按键来修改粒子系统粒子的大小。 步骤&#xff1a; 1、粒子系统使用上一个实例的粒子系统&#xff0c;大体参数如下&#xff1a; 参数都是乱调的&#xff0c;自己可以随意设置&#xff0c;只注重方法而不在意好看&#xff0c;汗…

求5X5的次小值/次大值

我们知道&#xff0c;求最大值和最小值是比较容易的&#xff0c;就是通过分组判断&#xff0c;然后再次比较即可求出&#xff0c;那么求出次小值/次大值怎么实现呢&#xff0c;本文提供一个设计的思路。 以5x5为例&#xff0c;求出次小值&#xff0c; 第一步&#xff0c;先分…

H5 随机身份证号码、社会统一信用代码、手机号、名字、银行卡号码

平时注册可能会用到这些&#xff0c;原本用自己服务器搭了个&#xff0c;感觉纯前端的还能引入到项目中挺好的&#xff0c;之后再追加一些常用的随机数据&#xff0c;这样写表单应该就会好测试了(●’◡’●)。 在线链接 https://linyisonger.github.io/H5.Examples/?name./07…