精华内容
下载资源
问答
  • 迪米特法则最初是用来作为面向对象的系统设计的一种法则,于1987年秋天由Lan Holland美国东北大学为一个叫做迪米特的项目设计中提出。 通俗的将,迪米特法则可以叫做:“不要和陌生人说话”! 2、迪米特法则应用...

    1、什么是迪米特法则

    迪米特法则(Law of Demeter) ,又叫最小知识原则,是指一个对象应该对其他对象尽可能少的了解。

    迪米特法则最初是用来作为面向对象的系统设计的一种法则,于1987年秋天由Lan Holland在美国东北大学为一个叫做迪米特的项目设计中提出。

    通俗的将,迪米特法则可以叫做:“不要和陌生人说话”!

    2、迪米特法则应用 – 直接耦合

    人与狗直接耦合

    3、迪米特法则 – 与朋友对话

    通过适配器耦合(最直接的朋友)

    1、façade模式

    2、中介者模式

    因为迪米特法则要求类与类之间尽量不直接通信,如果类之间需要通信就通过第三方转发的方式,这就直接导致了系统中存在大量的中介类,这些类存在的唯一原因是为了传递类与类之间的相互调用关系,这就毫无疑问的增加了系统的复杂度。解决这个问题的方式是:使用依赖倒转原则(通俗的讲就是要针对接口编程,不要针对具体编程)

    4、迪米特法则 – 与接口对话

    依赖倒置原则

    人和狗的对象都继承与稳定的接口或者抽象类,那么依赖与抽象的接口依赖则更加稳定。

    5、迪米特法则要义

    • 只暴露应该暴露的方法或属性,尽可能的降低成员的访问权限
    • 从依赖角度上将,只依赖应该依赖的对象
      1. 依赖第三方,通过第三方转发信息或职责
      2. 依赖稳定的抽象接口
    展开全文
  • 因此,应用迪米特法则有可能造成的一个后果就是:系统中存在大量的中介类,这些类之所以存在完全是为了传递类之间的相互调用关系——这一定程度上增加了系统的复杂度。 有兴趣可以研究一下设计模式的门

    lod迪米特法则就是说一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。

    迪米特法则的初衷在于降低类之间的耦合。由于每个类尽量减少对其他类的依赖,因此,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系。
    迪米特法则不希望类之间建立直接的联系。如果真的有需要建立联系,也希望能通过它的友元类来转达。因此,应用迪米特法则有可能造成的一个后果就是:系统中存在大量的中介类,这些类之所以存在完全是为了传递类之间的相互调用关系——这在一定程度上增加了系统的复杂度。
    有兴趣可以研究一下设计模式的门面模式(Facade)和中介模式(Mediator),都是迪米特法则应用的例子。

    狭义的迪米特法则
    如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中的一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。
    朋友圈的确定
    “朋友”条件:
    1)当前对象本身(this)
    2)以参量形式传入到当前对象方法中的对象
    3)当前对象的实例变量直接引用的对象
    4)当前对象的实例变量如果是一个聚集,那么聚集中的元素也都是朋友
    5)当前对象所创建的对象
    任何一个对象,如果满足上面的条件之一,就是当前对象的“朋友”;否则就是“陌生人”。
    狭义的迪米特法则的缺点:
    在系统里造出大量的小方法,这些方法仅仅是传递间接的调用,与系统的商务逻辑无关。
    遵循类之间的迪米特法则会是一个系统的局部设计简化,因为每一个局部都不会和远距离的对象有直接的关联。但是,这也会造成系统的不同模块之间的通信效率降低,也会使系统的不同模块之间不容易协调。
    门面模式和调停者模式实际上就是迪米特法则的应用。
    广义的迪米特法则在类的设计上的体现:
    优先考虑将一个类设置成不变类。
    尽量降低一个类的访问权限。
    谨慎使用Serializable。
    尽量降低成员的访问权限。


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

    举个例子

    家人探望犯人

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

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

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

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

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

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

    场景类:发生在监狱里

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

    运行结果:

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

     

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

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

    家人

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

    犯人

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

    狱友

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

    监狱

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

    运行结果

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

     

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

     

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

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


    原文链接:http://www.cnblogs.com/loulijun/archive/2012/03/10/2389573.html

    展开全文
  • 应用场景比较明确,主要接口设计方面使用。 1.解决易用性问题: 门面模式可以用来封装系统的底层实现,隐藏系统的复杂性,提供一组更加简单易用、更高层的接口。实际上,从隐藏实现复杂性,提供更易用接口这个意图...

    门面模式,也叫外观模式,英文全称是 Facade Design Pattern。应用场景比较明确,主要在接口设计方面使用。

    1.解决易用性问题:

    门面模式可以用来封装系统的底层实现,隐藏系统的复杂性,提供一组更加简单易用、更高层的接口。实际上,从隐藏实现复杂性,提供更易用接口这个意图来看,门面模式有点类似之前讲到的迪米特法则(最少知识原则)和接口隔离原则:两个有交互的系统,只暴露有限的必要的接口。

    2.解决性能问题:

    我们通过将多个接口调用替换为一个门面接口调用,减少网络通信成本,提高 App 客户端的响应速度。
    如果门面接口不多,我们完全可以将它跟非门面接口放到一块,也不需要特殊标记,当作普通接口来用即可。如果门面接口很多,我们可以在已有的接口之上,再重新抽象出一层,专门放置门面接口,从类、包的命名上跟原来的接口层做区分。如果门面接口特别多,并且很多都是跨多个子系统的,我们可以将门面接口放到一个新的子系统中。

    3.解决分布式事务问题:

    要支持两个接口调用在一个事务中执行,是比较难实现的,这涉及分布式事务问题。虽然我们可以通过引入分布式事务框架或者事后补偿的机制来解决,但代码实现都比较复杂。
    现在我们可以借鉴门面模式的思想,再设计一个包裹这两个操作的新接口,让新接口在一个事务中执行两个 SQL 操作。

    展开全文
  • 外观模式遵守了设计模式六大原则之一的迪米特法则(最少知识法则),一个应用实体应当尽可能少的与其他实体发生相互作用。 外观模式的实用性: 1.为一个复杂子系统提供一个简单接口。 2.提高子系统的独立性。 3....

    外观模式在我们的项目中使用的还是比较普遍的。外观模式遵守了设计模式六大原则之一的迪米特法则(最少知识法则),一个应用实体应当尽可能少的与其他实体发生相互作用。
    外观模式的实用性:
    1.为一个复杂子系统提供一个简单接口。
    2.提高子系统的独立性。
    3.在层次化结构中,可以使用外观模式定义系统中每一层的入口。
    举个例子:这个例子跟代理模式里面的例子一样还是关于接项目的事情,假如说我在北京工作,接了一个上海的项目,但是由于太远我又不想去上海,怎么办呢?此时刚好我一个同学在上海上班,于是我就跟我的同学联系,让他帮我把这个项目谈过来。接项目肯定需要 面谈—>起草合同—>收首款—>做项目—>收尾款。除了完成项目的过程是由我本人执行之外,其他的都是由我同学来处理的。就在此时,我另一个同学在北京也是接了一个上海的项目,他了解了我同学帮我谈项目的事情以后,也想找他帮忙。这样我和北京同学我俩就没必要直接跟上海的打交道了,而是由上海的同学处理。
    这里写图片描述
    通过上图就可以知道外观模式的作用了,节省了很多步骤,不然的话就会是第一种情况,那样的话就得不偿失了。
    示例代码:
    Project接口

    public interface Project {
        String doSth();
    }

    面谈Interview类

    public class Interview implements Project {
        @Override
        public String doSth() {
            return "interview--->";
        }
    }

    起草合同DrafContract类

    public class DrafContract implements Project {
        @Override
        public String doSth() {
            return "drafContract--->";
        }
    }

    收首款ReceiveFirst类

    public class ReceiveFirst implements Project {
        @Override
        public String doSth() {
            return "receiveFirst--->";
        }
    }

    收尾款EndParagraph类

    public class EndParagraph implements Project {
        @Override
        public String doSth() {
            return "endParagraph--->";
        }
    }

    同学Schoolmate类

    public class Schoolmate {
        public void doSth(){
            Project interview = new Interview();
            System.out.println(interview.doSth());
            Project drafContract = new DrafContract();
            System.out.println(drafContract.doSth());
            Project receiveFirst = new ReceiveFirst();
            System.out.println(receiveFirst.doSth());
            Project endParagraph = new EndParagraph();
            System.out.println(endParagraph.doSth());
        }
    }

    测试代码

    new Schoolmate().doSth();

    运行效果图
    这里写图片描述
    外观模式到这里就结束,其实我们通用的工具类就是这个模式。

    展开全文
  • 如果一个系统里各个对象之间存在多对多的相互关系,可以将对象之间的一些交互行为从各个对象分离出来,集中封装一个中介者对象,使其耦合松散,并由中介者统一协调。通过中介者,对象之间的多对多关系就简化了...
  • 设计模式:外观模式

    2020-12-04 18:24:56
    外观(Facade)模式是“迪米特法则”的典型应用 优点: 降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类。 对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来...
  • Android 设计模式(一)

    千次阅读 2013-11-27 09:34:43
    运用迪米特法则系统设计中时,要注意以下几点: 第一:类的划分上,应当创建弱耦合的类,类与类之间的耦合越弱,就越有利于实现可复用的目标。 第二:类的结构设计上,每个类都应该降低成员的访问权限。 第...
  • 设计模式~~~外观模式

    2020-10-12 15:53:46
    外观模式是“迪米特法则”的典型应用 一、 定义 是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,...
  • 这时如果系统内部发生改变,客户端也要跟着改变,这违背了“开闭原则”,也违背了“迪米特法则”,所以有必要为多个子系统提供一个统一的接口,从而降低系统的耦合度,这就是外观模式的目标。 优
  • 外观模式是“迪米特法则” 的典型应用,主要有以下主要优点: 降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类; 对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用...
  • java设计模式—中介者模式(Mediator pattern) 1. 概述 如果一个系统中对象之间存在多对多的相互关系,...通过引入中介者来简化对象之间的复杂交互,中介者模式是“迪米特法则”的一个典型应用. 2. 定义 ...
  • 外观模式介绍 外观(Facade)模式又叫作门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。...降低了大型软件系统中的编译依赖性,简化了系统在不同平台之间的移植过程
  • 设计模式—门面模式

    2020-06-01 15:21:03
    门面(Facade)模式的定义:是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的...门面模式是“迪米特法则...
  • C#设计模式大全

    2012-08-05 08:53:46
    六、 迪米特法则(LoD) C#设计模式(4)-Simple Factory Pattern 一、 简单工厂(Simple Factory)模式 二、 Simple Factory模式角色与结构: 三、 程序举例: 四、 Simple Factory模式演化 五、 优点与缺点...
  • C#设计模式.PDF

    热门讨论 2009-03-16 18:18:59
    六、 迪米特法则(LoD) 22 C#设计模式(4)-Simple Factory Pattern 24 一、 简单工厂(Simple Factory)模式 24 二、 Simple Factory模式角色与结构: 24 三、 程序举例: 25 四、 Simple Factory模式演化 27 五...
  • 文章目录外观模式的定义与特点外观模式的结构外观模式的实现外观模式的应用场景 现实生活,常常存在办事较复杂...这时如果系统内部发生改变,客户端也要跟着改变,这违背了“开闭原则”,也违背了“迪米特法则”...
  •  完美地体现了依赖倒转原则和迪米特法则的思想。  Facade模式应用场景:  首先,在设计初期阶段,应该要有意识的将不同的两个层分离,比如经典的三层架构,就需要考虑数据访问层和业务逻辑层、业务逻辑层和...
  • Java基础知识总结(五)——安全

    千次阅读 2015-12-31 00:12:51
    整理时,我觉得基于第三方的数字签名认证的方式充分体现了解耦的思想,这和集群中心式拓扑结构的方式很像,将复杂耦合几种中介上(中介者模式和迪米特法则),设计模式这个东西只要仔细理解,灵活运用才可以...
  • Java与模式(源码部分)

    热门讨论 2012-08-26 18:22:30
    读过本书之后,读者可以很有信心地自己的系统设计工作使用学过的内容,与同事交流面向对象的设计经验,并事业发展上有更多的收获。 本书适合于Java程序员、架构设计师及设计模式爱好者,是一本实用的设计原则...
  • 09_抽象类多继承应用 10_面向抽象类编程_计算程序员工资 11_中午课程回顾 12_信息系统框架集成第三方产品案例_背景和需求 13_信息系统框架集成第三方产品案例_编码实现分析_传智扫地僧 14_信息系统框架集成第...
  • 对Spring、MyBatis、Dubbo等开源框架熟悉,并能了解它的原理和机制,具有大型分布式系统设计研发经验; 熟悉基于Mysql关系数据库设计和开发、对数据库性能优化有丰富的经验; 熟悉底层中间件、分布式技术(如RPC框架...

空空如也

空空如也

1 2
收藏数 22
精华内容 8
关键字:

在系统设计中应用迪米特法则