3.6设计模式————迪米特法则——面向对象设计原则

2023-11-14

迪米特法则的定义

迪米特法则(Law of Demeter,LoD)又叫作最少知识原则(Least Knowledge Principle,LKP),产生于 1987 年美国东北大学(Northeastern University)的一个名为迪米特(Demeter)的研究项目,由伊恩·荷兰(Ian Holland)提出,被 UML 创始者之一的布奇(Booch)普及,后来又因为在经典著作《程序员修炼之道》(The Pragmatic Programmer)提及而广为人知。

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

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

迪米特法则的优点

迪米特法则要求限制软件实体之间通信的宽度和深度,正确使用迪米特法则将有以下两个优点。

  1. 降低了类之间的耦合度,提高了模块的相对独立性。
  2. 由于亲合度降低,从而提高了类的可复用率和系统的扩展性。


但是,过度使用迪米特法则会使系统产生大量的中介类,从而增加系统的复杂性,使模块之间的通信效率降低。所以,在釆用迪米特法则时需要反复权衡,确保高内聚和低耦合的同时,保证系统的结构清晰。

迪米特法则的实现方法

从迪米特法则的定义和特点可知,它强调以下两点:

  1. 从依赖者的角度来说,只依赖应该依赖的对象。
  2. 从被依赖者的角度说,只暴露应该暴露的方法。


所以,在运用迪米特法则时要注意以下 6 点。

  1. 在类的划分上,应该创建弱耦合的类。类与类之间的耦合越弱,就越有利于实现可复用的目标。
  2. 在类的结构设计上,尽量降低类成员的访问权限。
  3. 在类的设计上,优先考虑将一个类设置成不变类。
  4. 在对其他类的引用上,将引用其他对象的次数降到最低。
  5. 不暴露类的属性成员,而应该提供相应的访问器(set 和 get 方法)。
  6. 谨慎使用序列化(Serializable)功能。


【例1】明星与经纪人的关系实例。

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

明星与经纪人的关系图
图1 明星与经纪人的关系图


程序代码如下:

package principle;
public class LoDtest
{
public static void main(String[] args)
{
Agent agent=new Agent();
agent.setStar(new Star("林心如"));
agent.setFans(new Fans("粉丝韩丞"));
agent.setCompany(new Company("中国传媒有限公司"));
agent.meeting();
agent.business();
}
}
//经纪人
class Agent
{
private Star myStar;
private Fans myFans;
private Company myCompany;
public void setStar(Star myStar)
{
this.myStar=myStar;
}
public void setFans(Fans myFans)
{
this.myFans=myFans;
}
public void setCompany(Company myCompany)
{
this.myCompany=myCompany;
}
public void meeting()
{
System.out.println(myFans.getName()+"与明星"+myStar.getName()+"见面了。");
}
public void business()
{
System.out.println(myCompany.getName()+"与明星"+myStar.getName()+"洽淡业务。");
}
}
//明星
class Star
{
private String name;
Star(String name)
{
this.name=name;
}
public String getName()
{
return name;
}
}
//粉丝
class Fans
{
private String name;
Fans(String name)
{
this.name=name;
}
public String getName()
{
return name;
}
}
//媒体公司
class Company
{
private String name;
Company(String name)
{
this.name=name;
}
public String getName()
{
return name;
}
}


程序的运行结果如下:

粉丝韩丞与明星林心如见面了。
中国传媒有限公司与明星林心如洽淡业务。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

3.6设计模式————迪米特法则——面向对象设计原则 的相关文章

  • NodeJS的os模块

    附录 常用HTTP响应头和请求头信息对照表 Node简介 第一个node程序 module 模块系统 npm包管理器 模块系统优先级 认识http内置模块 url内置模块 path内置模块 fs内置模块 http模块服务端进阶 http报文
  • 区块链学习笔记(四)【Merkle树】

    一 字典树 字典树的三个基本特征 1 根节点不包含字符 为空 除根节点外每一个节点只包含一个字符 2 从根节点到某一个节点 路径上经过的字符连接起来 就是该节点对应的字符串 3 每个节点包含的所有子节点的字符都不相同 优势 相比较于哈希表

随机推荐

  • 云计算基础教程(第2版)笔记——基础篇与技术篇介绍

    文章目录 前言 第一篇 基础篇 一 绪论 1 1 云计算的概念以及特征 1 1 1云计算的基本概念 1 1 2云计算的基本特征 1 2 云计算发展简史 1 3 三种业务模式介绍 1 基础设施即服务 IaaS 2 平台即服务 PaaS 3 软
  • leetcode-每日一题2022.3.17 词典中最长的单词

    题目 力扣 思路 模拟 先把words中的字符串放到哈希表里 再遍历words的每一个字符串 判断它从0开始的每一个子串是否存在于哈希表里 代码 class Solution public string longestWord vector
  • 【验证小白】只有SV+modelsim学验证(4)——想办法合理的结束仿真后,准备好了所有代码

    前言 把checker加入到环境中后 环境组件基本就搭建完成了 试着跑了跑出了发现之前的pkt data有一些问题外 还发现仿真结束机制太不合理了 过于简单粗暴 于是把结束仿真的行为梳理一下 做的更合理一些 参考了VMM的思路 做一个漏洞百
  • nginx只允许域名访问的配置方法(ngnix禁止IP访问的配置方法)

    1 只允许域名访问的配置方法一 修改配置文件 判断是否用域名访问 server listen 8081 server name www tq com if host www tq com return 403 2 只允许域名访问的配置方法二
  • HCIP第十一次作业-MPLS

    实验要求及拓扑图 第一步 配IP地址 按要求1配就行 第二步 在R2 R7上起OSPF协议 并把用户环回口改为广播 查看表 第三步 在R2 R7上起MPLS协议 查看表 第四步 在R2 R5 R7上起BGP协议且建邻 在华为设备上还要开启
  • 61-C语言-小猴吃桃问题

    问题 猴桑第一天兴高采烈地采了好多桃子 并且吃了一半 太好吃了 然后又多吃了一个 第二天又吃了一半多一个 以此类推 到第十天的时候 再想吃的时候就剩下1个桃子了 那么请问 第一天猴桑摘了多少桃子 思路 跟做数学题一样 先提取有用条件 1 到
  • 光功率和光衰的单位_太阳能照明的功率、流明与照度的计算方法

    今天小编来给大家聊一聊太阳能照明应用中的一些实际问题 我们经常会收到这样的问题 我的院子100个平方 要选多大功率的太阳能灯 分别要多少个才够亮 本公司印度某地工程项目 这里有一个比较简单的估算公式推荐给大家 首先我们确定自已想要达到一个什
  • python怎么装_python如何安装pickle

    pickle是python语言的一个标准模块 安装python后已包含pickle库 不需要单独再安装 pickle模块实现了基本的数据序列化和反序列化 推荐学习 Python视频教程 通过pickle模块的序列化操作我们能够将程序中运行的
  • 大数据毕设项目 大数据实时疫情数据可视化系统 - flask python

    文章目录 1 课题背景 2 数据库设计实现 3 实现效果 4 Flask框架 5 爬虫 6 Ajax技术 7 Echarts 8 最后 1 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业
  • 使用pytorch版faster-rcnn训练自己数据集

    使用pytorch版faster rcnn训练自己数据集 引言 faster rcnn pytorch代码下载 训练自己数据集 接下来工作 参考文献 引言 最近在复现目标检测代码 师兄强烈推荐FPN 但本文只针对Faster RCNN 大家
  • 小程序swiper动态数据不显示

    情景一 swiper的current不在第一页了 导致第一页的数据看不到 处理方法 在请求数据的时候重置current为0 即
  • C语言printf和scanf函数

    最近在敲c语言例子的时候 对于很多小知识点不清楚 这里主要根据例子来总结一下 一 printf函数 1 printf是格式输出函数 它的作用是想终端输出若干个任意类型的数据 一般格式如下 printf 格式控制 输出表列 例如 printf
  • (Java 基础知识) Java线程池

    ExecutorService 建立多线程的步骤 1 定义线程类 class Handler implements Runnable 2 建立ExecutorService线程池 ExecutorService executorServic
  • 配置logback 不打印日志

    今天尝试下logback 做测试
  • 【C++】 Qt-事件(下)(事件过滤、自定义事件)

    文章目录 事件过滤 自定义事件 事件过滤 event 函数是一个protected的函数 这意味着我们要想重写event 必须继承一个已有的组件类 重写其event 函数 event 函数的确有一定的控制 不过有时候我的需求更严格一些 我希
  • DB2数据库跨实例恢复

    DB2数据库也可以和Oracle一样 进行异机或跨实例进行备份集的恢复 原理与Oracle有几分类似 但DB2对表空间的处理有点特殊 分自动管理的表空间和非自动管理的表空间 经过测试 大致恢复过程如下 首先在线备份原数据库 包含原数据库的日
  • Windows 10 安装python到U盘并设计自动添加环境变量脚本

    1 在python官网正常下载python安装包 2 U盘插到电脑上 安装到U盘的版本如果和电脑上的完全相同 则需要暂时屏蔽python环境变量 未实验 我选择的是在U盘中安装的32位的python3 7 9 笔记本电脑上安装的是64位的p
  • 在qt项目中使用外部第三方字体库字体

    文章目录 一 第三方字体库字体 二 使用方法 1 直接代码添加 2 使用QSS进行添加 一 第三方字体库字体 在项目开发中 有时候我们可能会由于某些原因会用到qt所提供的字体库之外的字体 这个时候就不可以直接设置字体了 需要做一些操作才行
  • 转:在线HTML编辑器 CKEditor4 下载及使用说明。

    转 在线HTML编辑器 CKEditor4 下载及使用说明 这里是CKEditor4最新版本 演示实例 其它实例请下载后可查看源码 CKEditor4是FCKeditor之后重新开发的版本 是一款专门使用在网页上属于开放源代码的所见即所得文
  • 3.6设计模式————迪米特法则——面向对象设计原则

    迪米特法则的定义 迪米特法则 Law of Demeter LoD 又叫作最少知识原则 Least Knowledge Principle LKP 产生于 1987 年美国东北大学 Northeastern University 的一个名为