美文网首页Java
面向对象的7种设计原则(6)-迪米特原则

面向对象的7种设计原则(6)-迪米特原则

作者: 一觉睡到丶小时候 | 来源:发表于2020-07-06 08:31 被阅读0次

    迪米特原则

    迪米特原则(Law of Demeter)又叫最少知道原则(Least Knowledge Principle),可以简单说成:talk only to your immediate friends,只与你直接的朋友们通信,不要跟“陌生人”说话。


    图片.png

    模式与意义

    迪米特法则,如果两个类不必彼此直接通向,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个累哦的某一个方法的话,可以通过第三者转发这个调用。

    迪米特法则首先强调的前提是在类的结构设计上,每一个类都应当降低成员的访问权限,也就是说,一个类包装好自己的private状态,不需要让别的类知道的字段或行为就不要公开。

    面向对象的设计原则和面向对象的三大特性本就不是矛盾的。迪米特法则其根本思想,是强调了类之间的松耦合。类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成搏击,也就是说,信息的隐藏促进了软件的复用。

    优点

    减少对象之间的耦合性


    图片.png

    摘自大话设计模式:


    图片.png 图片.png 图片.png

    注意

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

    举例

    明星与经纪人的关系实例

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


    图片.png
    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;
        }
    }
    

    个人博客
    腾讯云社区
    掘金
    CSDN
    公众号:

    wx.jpg

    相关文章

      网友评论

        本文标题:面向对象的7种设计原则(6)-迪米特原则

        本文链接:https://www.haomeiwen.com/subject/wugiqktx.html