• 面向对象编程原则(09)——迪米特法则



    版权声明

    • 本文原创作者:谷哥的小弟
    • 作者博客地址:http://blog.csdn.net/lfdfhl

    参考资料

    1. 《大话设计模式》 作者:程杰
    2. 《Java设计模式》 作者:刘伟
    3. 《图解设计模式》 作者:结城浩
    4. 《重学Java设计模式》 作者:付政委
    5. 《Head First设计模式》作者:埃里克·弗里曼

    迪米特法则概述

    迪米特法则来自于1987年美国东北大学(NortheasternUniversity)的一个名为 Demeter的研究项目。迪米特法则(Law of Demeter,LoD)又称为最少知识原则(LeastKnowledge Principle,LKP)。

    该原则定义如下:

    每一个软件单位对其他单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。

    Each unit should have only limited knowledge about other units: only units “closely” related to the current unit

    迪米特法则要求一个软件实体应当尽可能少地与其他实体发生相互作用。如果一个系统符合迪米特法则,那么当其中的某一个模块发生修改时就会尽量少地影响其他模块;与此同时,扩展会相对容易。应用迪米特法则可降低系统的耦合度,使类与类之间保持松散的耦合关系。

    迪米特法则还有几种定义形式,包括不要和“陌生人”说话(Don’t talk to strangers)、只与你的直接朋友通信(Talk only to your immediate friends)等。在迪米特法则中,对于一个对象,其朋友包括以下几类:

    • 1、当前对象本身即this。
    • 2、以参数形式传人到当前对象方法中的对象。
    • 3、当前对象的成员对象。
    • 4、如果当前对象的成员对象是一个集合,那么集合中的元素也都是朋友。
    • 5、当前对象所创建的对象。

    任何一个对象如果满足上面的条件之一,就是当前对象的“朋友”,否则就是“陌生人”。

    在应用迪米特法则时,一个对象只能与直接朋友发生交互,不要与“陌生人”发生直接交互。这样做可以降低系统的耦合度,一个对象的改变不会给太多其他对象带来影响。迪米特法则要求在设计系统时应该尽量减少对象之间的交互,如果两个对象之间不必彼此直接通信,那么这两个对象就不应当发生任何直接的相互作用,如果其中一个对象需要调用另一个对象的方法,可以通过“第三者”转发这个调用。简而言之,就是通过引入一个合理的“第三者”来降低现有对象之间的耦合度。

    在将迪米特法则运用到系统设计中时要注意下面几点:

    • 1、在类的划分上应当尽量创建松耦合的类,类之间的耦合度越低,就越有利于复用,一个处在松耦合中的类一日被修改不会对关联的类造成太大影响
    • 2、在类的结构设计上,每一个类都应当尽量降低其成员变量和成员函数的访问权限
    • 3、在类的设计上,只要有可能一个类型应当设计成不变类
    • 4、在对其他类的引用上,一个对象对其他对象的引用应当降到最低。

    迪米特法则案例

    歌手明星Star最主要的精力在于创作和演唱,所以歌手的许多日常事务由经纪人Agent负责处理;例如,和粉丝Fans的见面会、和演艺公司Company的商演接洽等。所以,明星只用于其经纪人打交道而不用与粉丝、演艺公司直接来往。此处,经纪人是明星"朋友",而粉丝和演艺公司是明星的"陌生人"。

    在这里插入图片描述

    Fans

    package com.lod01;
    /**
     * 原创作者:谷哥的小弟
     * 博客地址:http://blog.csdn.net/lfdfhl
     */
    public class Fans {
    
        private String name;
    
        public String getName() {
            return name;
        }
    
        public Fans(String name) {
            this.name = name;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这里插入图片描述

    Company

    package com.lod01;
    /**
     * 原创作者:谷哥的小弟
     * 博客地址:http://blog.csdn.net/lfdfhl
     */
    public class Company {
        private String name;
    
        public String getName() {
            return name;
        }
    
        public Company(String name) {
            this.name = name;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

    Star

    package com.lod01;
    /**
     * 原创作者:谷哥的小弟
     * 博客地址:http://blog.csdn.net/lfdfhl
     */
    public class Star {
        private String name;
    
        public Star(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

    Agent

    package com.lod01;
    /**
     * 原创作者:谷哥的小弟
     * 博客地址:http://blog.csdn.net/lfdfhl
     */
    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() + "洽谈商演");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    在这里插入图片描述

    Test

    package com.lod01;
    /**
     * 原创作者:谷哥的小弟
     * 博客地址:http://blog.csdn.net/lfdfhl
     */
    public class Test {
    	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();
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    在这里插入图片描述

  • 相关阅读:
    一款自动生成CRUD代码的自定义Starter
    使用 Python 发送带附件的电子邮件教程
    程序包lombok不存在,纠正网上错误答案
    C++ 信息学奥赛 2048:【例5.18】串排序
    【Java】ArrayList集合存入学生对象
    文心一言 VS 讯飞星火 VS chatgpt (109)-- 算法导论10.1 7题
    专家建议|8大措施加速你的创新职业规划和成长
    LSTM 词语模型上的动态量化
    JAVA经典百题之9的次数
    【16-配置中心之Nacos的基本使用&Nacos服务之命令空间、Nacos服务之配置组、Nacos服务之配置拆分】
  • 原文地址:https://blog.csdn.net/lfdfhl/article/details/126681202