IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 从零开始学习Java设计模式 | 软件设计原则篇:迪米特法则 -> 正文阅读

[Java知识库]从零开始学习Java设计模式 | 软件设计原则篇:迪米特法则

在本讲,我将为大家介绍软件设计原则里面的第五个原则,即迪米特法则。

概述

迪米特法则,又叫最少知识原则。其表示的含义是只和你的直接朋友交谈,不跟"陌生人"说话。

看到这儿的话,很多人会一头雾水,尼玛的,这到底表示什么含义啊?不着急,咱们看下下面这段描述。

如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。

大家看到这儿,可能还不是特别理解,没关系,下面我会举几个现实生活中的例子来向大家解释一下。

看这样一个例子,如果一个人想要租房的话,那么他找的就该是房屋中介了,而不是直接的房主;再来看这样一个例子,明星和粉丝进行见面的话,肯定是由经纪人来进行安排的,是不是啊?

最后,再看一个例子,假设现在有家公司需要一个办公软件,那么这家公司是直接找具体的软件工程师,还是找某家开发软件的公司啊?肯定是软件公司,而软件公司又会有许多软件工程师,所以它会把甲方需要的办公软件交给具体的软件工程师去开发。其实,软件工程师在去开发软件的时候,很多情况下,他是压根就不知道到底是哪个甲方需要这个软件的,因此他是不需要直接去和甲方沟通的。如果要沟通的话,那么可以通过第三方转发进行沟通。也就是说,软件工程师把他在开发中遇到的问题告诉公司,公司再跟甲方进行沟通,这样,就可以降低软件工程师和甲方之间的耦合度了,继而提高模块的相互独立性。

看完以上我举的这三个例子,特别是最后一个例子,大家是不是对迪米特法则有了一个更深入的认识啊!

最后,我得多说一嘴,迪米特法则里面有一个"朋友"这个词,它所表示的含义是指当前对象本身、当前对象的成员对象、当前对象所创建的对象、当前对象的方法参数等,这些对象同当前对象存在关联、聚合或组合关系(当然,这里面还有依赖关系,因为有方法参数这样一个概念),可以直接访问这些对象的方法。

以上就是"朋友"所带来的好处,说得通俗一点,就是我可以直接去访问你里面的方法。

案例

了解了迪米特法则的概念之后,接下来我们来做一个案例,即明星与经纪人的关系实例,通过这个案例,希望能加深大家对迪米特法则的理解。

案例分析

明星由于全身心投入艺术,所以许多日常事务均由经纪人负责处理,如和粉丝的见面会,和媒体公司的业务洽淡等。这里的经纪人是明星的朋友,而粉丝和媒体公司是陌生人,所以适合使用迪米特法则。

通过上面的描述,我们不难设计出如下所示的类图。

在这里插入图片描述

从以上类图中可以看到,我们定义了一个明星类,它里面有一个name成员变量,用于表示明星的姓名,而且还有一个有参构造和获取明星姓名的getName方法。至于,另外定义的两个类,即粉丝类和媒体公司类,它俩与明显类比较相似,这里我就不再详细赘述了。

目前,定义好的以上这三个类是没有任何关系的,如果我们要让它们产生关系,那么就得借助于第三方类了,即经纪人类。在该类里面我们会声明以上三个类型的成员变量,并提供对应的setter方法,此外,我们还提供了与粉丝见面和业务洽谈这俩成员方法,而且这俩成员方法的具体描述,我也体现在以上类图中了。

有些同学可能会问,经纪人类和明星类、粉丝类、媒体公司类这三个类有什么关系呢?由于是在经纪人类里面声明了这三个类型的成员变量,所以经纪人类和这三个类就是属于聚合关系了,相信大家对这点是没有任何疑问的。

接下来,我们便来通过代码实现以上明星与经纪人的关系案例。

案例实现

打开咱们的maven工程,然后在com.meimeixia.principles包下创建一个子包,即demo5,我们是在该包下来存放咱们编写的代码的。接下来,我们就要正式开始编写代码来实现以上案例了。

首先,定义一个明星类。

package com.meimeixia.principles.demo5;

/**
 * 明星类
 * @author liayun
 * @create 2021-05-28 12:37
 */
public class Star {
    private String name;

    public Star(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

然后,定义一个粉丝类。

package com.meimeixia.principles.demo5;

/**
 * 粉丝类
 * @author liayun
 * @create 2021-05-28 12:39
 */
public class Fans {
    private String name;

    public Fans(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

接着,定义一个媒体公司类。

package com.meimeixia.principles.demo5;

/**
 * 媒体公司类
 * @author liayun
 * @create 2021-05-28 12:43
 */
public class Company {
    private String name;

    public Company(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

紧接着,定义一个经纪人类。

package com.meimeixia.principles.demo5;

/**
 * 经纪人类
 * @author liayun
 * @create 2021-05-28 12:52
 */
public class Agent {
    private Star star;
    private Fans fans;
    private Company company;

    public void setStar(Star star) {
        this.star = star;
    }

    public void setFans(Fans fans) {
        this.fans = fans;
    }

    public void setCompany(Company company) {
        this.company = company;
    }

    // 和粉丝见面的方法
    public void meeting() {
        System.out.println(star.getName() + "和粉丝" + fans.getName() + "见面");
    }

    // 和媒体公司洽谈的方法
    public void business() {
        System.out.println(star.getName() + "和" + company.getName() + "洽谈");
    }
}

最后,我们来编写一个测试类用作测试,不妨取名为Client。

package com.meimeixia.principles.demo5;

/**
 * @author liayun
 * @create 2021-05-28 13:09
 */
public class Client {
    public static void main(String[] args) {
        // 创建经纪人类
        Agent agent = new Agent();
        // 创建明星对象
        Star star = new Star("林青霞");
        agent.setStar(star);
        // 创建粉丝对象
        Fans fans = new Fans("张三");
        agent.setFans(fans);
        // 创建媒体公司对象
        Company company = new Company("美美侠媒体公司");
        agent.setCompany(company);

        agent.meeting(); // 和粉丝见面
        agent.business(); // 和媒体公司洽谈业务
    }
}

以上测试类编写好之后,不妨来运行一下,如下图所示,确实是我们想要的结果哟!

在这里插入图片描述

至此,我们就通过以上案例更加深入地认识了一下迪米特法原则,它其实就是为了降低明星类和粉丝类以及媒体公司类之间的一个耦合度。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-07-10 14:24:43  更:2021-07-10 14:25:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/17 20:39:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码