zoukankan      html  css  js  c++  java
  • 【设计模式】迪米特法则

    一,概述

            迪米特法则(Law of Demeter)又叫作最少知识原则(Least Knowledge Principle 简写LKP),就是说一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。英文简写为: LoD

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

             在类的架构上,每一个类都应尽量降低成员的访问权限(private)。类之间的松耦合越弱,越容易复用,就是说处在弱耦合中的类容易被修改。

     

    二,示例

               形象一点的比喻类似于:监狱内的犯人是不应该跟外面的人接触的,当然或许会有探亲的。这里的监狱就是类,里面的犯人就是类内部的信息,而监狱里的狱警就相当于迪米特法则的执行者

             例:家人探望犯人

    家人:家人只与犯人是亲人,但是不认识他的狱友

     
    public class Family {
    //家人探望犯人
    public void visitPrisoner(Prisoners prisoners)
    {
    //家人希望犯人与狱友互帮互助
    Inmates inmates = prisoners.helpEachOther();
    //狱友说,我们是盟友
    inmates.weAreFriend();
    }
    }

    犯人:犯人与家人是亲人,犯人与狱友是朋友

    public class Prisoners {
    private Inmates inmates = new Inmates();
    public Inmates helpEachOther()
    {
    System.out.println("家人说:你和狱友之间应该互相帮助...");
    return inmates;
    }
    }

    狱友:犯人与狱友是朋友,但是不认识他的家人

    //Inmates是狱友的意思
    public class Inmates {
    public void weAreFriend()
    {
    System.out.println("狱友说:我们是狱友...");
    }
    }

    场景类:发生在监狱里

    public class Prison {
    public static void main(String args[])
    {
    Family family = new Family();
    family.visitPrisoner(new Prisoners());
    }
    }

    运行结果:

             家人说:你和狱友之间应该互相帮助...
             狱友说:我们是狱友...

             看到这样的结果,是不是有些别扭,家人告诉犯人要与狱友好好相处,而狱友确冒出来说话。这显然越界了,因为监狱只允许家人探望犯人,而不是随便谁都可以见的

              这里的家人和狱友有了沟通是违背迪米特法则的,所以我们需要将家人和狱友隔离开,对其进行重构

    家人

    public class Family {
    //家人探望犯人
    public void visitPrisoner(Prisoners prisoners)
    {
    System.out.print("家人说:");
    prisoners.helpEachOther();
    }
    }

    犯人

    public class Prisoners {
    private Inmates inmates = new Inmates();
    public Inmates helpEachOther()
    {
    System.out.println("犯人和狱友之间应该互相帮助...");
    System.out.print("犯人说:");
    inmates.weAreFriend();
    return inmates;
    }
    }

    狱友

    //Inmates是狱友的意思
    public class Inmates {
    public void weAreFriend()
    {
    System.out.println("我们是狱友...");
    }
    }

    监狱

    public class Prison {
    public static void main(String args[])
    {
    Family family = new Family();
    family.visitPrisoner(new Prisoners());
    }
    }

    运行结果

    家人说:犯人和狱友之间应该互相帮助...
    犯人说:我们是狱友...

    这样家人和狱友就分开了,但是也表达了家人希望狱友能跟犯人互相帮助的意愿。也就是两个类通过第三个类(家人里面的犯人)实现信息传递

    网上还有如下一些关于应用迪米特法则的注意事项:

    ① 在类的划分上,应该创建有弱耦合的类;
    ② 在类的结构设计上,每一个类都应当尽量降低成员的访问权限;
    ③ 在类的设计上,只要有可能,一个类应当设计成不变类;
    ④ 在对其他类的引用上,一个对象对其它对象的引用应当降到最低;
    ⑤ 尽量降低类的访问权限;
    ⑥ 谨慎使用序列化功能;
    ⑦ 不要暴露类成员,而应该提供相应的访问器(属性)。

     

  • 相关阅读:
    windows的80端口被占用时的处理方法
    Ansible自动化运维工具安装与使用实例
    Tomcat的测试网页换成自己项目首页
    LeetCode 219. Contains Duplicate II
    LeetCode Contest 177
    LeetCode 217. Contains Duplicate
    LeetCode 216. Combination Sum III(DFS)
    LeetCode 215. Kth Largest Element in an Array(排序)
    Contest 176 LeetCode 1354. Construct Target Array With Multiple Sums(优先队列,递推)
    Contest 176
  • 原文地址:https://www.cnblogs.com/secbook/p/2654982.html
Copyright © 2011-2022 走看看