`

Java 设计模式 - 迪米特法则

 
阅读更多
迪米特法则的核心观念就是类间解耦,弱耦合,只有弱耦合了以后,类的复用性才可以提高。形象一点的比喻类似于:监狱内的犯人是不应该跟外面的人接触的,当然或许会有探亲的。这里的监狱就是类,里面的犯人就是类内部的信息,而监狱里的狱警就相当于迪米特法则的执行者。

迪米特法则(Law of emeter)

定义:一个对象应该对其他对象了解最少

迪米特法则的核心观念就是类间解耦,弱耦合,只有弱耦合了以后,类的复用性才可以提高。

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

举个例子

家人探望犯人

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

  1. package com.loulijun.chapter5;  
  2.    
  3. public class Family {  
  4.     //家人探望犯人  
  5.     public void visitPrisoner(Prisoners prisoners)  
  6.     {  
  7.         //家人希望犯人与狱友互帮互助  
  8.         Inmates inmates = prisoners.helpEachOther();  
  9.         //狱友说,我们是盟友  
  10.         inmates.weAreFriend();  
  11.     }  

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

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

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

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

场景类:发生在监狱里

  1. package com.loulijun.chapter5;  
  2.    
  3. public class Prison {  
  4.     public static void main(String args[])  
  5.     {  
  6.         Family family = new Family();  
  7.         family.visitPrisoner(new Prisoners());  
  8.     }  

运行结果:

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

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

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

家人

  1. package com.loulijun.chapter5;  
  2.    
  3. public class Family {  
  4.     //家人探望犯人  
  5.     public void visitPrisoner(Prisoners prisoners)  
  6.     {  
  7.         System.out.print("家人说:");  
  8.         prisoners.helpEachOther();  
  9.     }  

犯人

  1. package com.loulijun.chapter5;  
  2.    
  3. public class Prisoners {  
  4.     private Inmates inmates = new Inmates();  
  5.     public Inmates helpEachOther()  
  6.     {  
  7.         System.out.println("犯人和狱友之间应该互相帮助...");  
  8.         System.out.print("犯人说:");  
  9.         inmates.weAreFriend();  
  10.         return inmates;  
  11.     }  
  12.        

狱友

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

监狱

  1. package com.loulijun.chapter5;  
  2.    
  3. public class Prison {  
  4.     public static void main(String args[])  
  5.     {  
  6.         Family family = new Family();  
  7.         family.visitPrisoner(new Prisoners());  
  8.     }  

运行结果

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

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

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

① 在类的划分上,应该创建有弱耦合的类;

② 在类的结构设计上,每一个类都应当尽量降低成员的访问权限;

③ 在类的设计上,只要有可能,一个类应当设计成不变类;

④ 在对其他类的引用上,一个对象对其它对象的引用应当降到最低;

⑤ 尽量降低类的访问权限;

⑥ 谨慎使用序列化功能;

⑦ 不要暴露类成员,而应该提供相应的访问器(属性)。

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

分享到:
评论

相关推荐

    设计模式6大原则:迪米特法则

    设计模式6大原则:迪米特法则

    Java设计模式-面向对象七大设计原则

    例如:随着计算机的不断发展,程序学习这门技术也越来越重要,很多人都开启了...面向对象设计原则一共有七个:开闭原则、里氏替换原则、依赖倒转原则、单一职责原则、接口隔离原则、组合/聚合复用原则、迪米特法则。

    Java的设计模式编程中迪米特法则的应用示例

    主要介绍了Java的设计模式编程中迪米特法则的应用示例,迪米特法则中主张创建和使用弱耦合的类,需要的朋友可以参考下

    java设计模式

    目录: 前 言 第一部分 大旗不挥,谁敢冲锋——热身篇 第1章 单一职责原则 1.1 我是“牛”类,我可以担任多职吗 1.2 绝杀技,打破你的传统思维 1.3 我单纯,所以我快乐 1.4 最佳实践 ...附录:23个设计模式

    Java 设计模式

    java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元...

    全新150集通俗易懂的Java设计模式

    本教程为授权出品教程 ...授课采用 图解+框架源码分析的方式1) 内容包括:设计模式七大原则(单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特法则、合成复用)、UML类图(类的依赖、泛化和

    JAVA设计模式六大原则详细讲解(面向对象语言通用)

    5.迪米特法则还有一个更简单的定义:只与直接的朋友通信。其中,我们称出现成员变量、方法参数、方法返回值中的类为直接的朋友,而出现在局部变量中的类则不是直接的朋友。也就是说,陌生的类最好不要作为局部变量的...

    学习JAVA-23种设计模式

    学习JAVA-23种设计模式。1.设计模式的分类2.设计模式的六大原则3.依赖倒转原则4.接口隔离原则5.迪米特法则6.合成复用原则...

    尚硅谷设计模式源码笔记课件.zip

    1) 内容包括: 设计模式七大原则(单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特法则、合成复用)、UML类图(类的依赖、泛化和实现、类的关联、聚合和组合) 23种设计模式包括:创建型模式:单例模式(8种...

    design-pattern-java.pdf

    面向对象设计原则之里氏代换原则 面向对象设计原则之依赖倒转原则 面向对象设计原则之接口隔离原则 面向对象设计原则之合成复用原则 面向对象设计原则之迪米特法则 六个创建型模式 六个创建型模式 简单工厂模式-...

    java餐饮管理系统源码-pattern:设计模式扫盲,以身边故事来讲解设计模式

    设计模式 代码实践 TODO LIST UML图解 软件设计七大原则 1.开闭原则 2.依赖倒置原则 3.单一职责原则 4.接口隔离原则 5.迪米特法则 6.里氏替换原则 7.合成复用原则 创建型 单例模式 工厂模式 原型模式 建造者模式 ...

    Java与模式(清晰书签版) 设计模式 part3

    第1章 模式的简史和形而上学 第2章 统一建模语言UML简介 第3章 软件的可维护性和可复用性 ...第11章 迪米特法则 第12章 简单工厂模式 第13章 工厂方法模式 第14章 抽象工厂模式 第15章 单例模式 第16章 .......

    Head First 设计模式 JAVA源码

    所有的设计模式Java实现。 第一讲:简单工厂模式 第二讲:工厂方法模式 第三讲:抽象工厂模式 第四讲:工厂模式在开发中的运用 第五讲:单例模式 第六讲:原型模式 第七讲:建造者模式 第八讲:装饰模式 第...

    图解Java设计模式(一)

    1) 优秀的程序应该是这样...授课采用 图解+框架源码分析的方式1) 内容包括: 设计模式七大原则(单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特法则、合成复用)、UML类图(类的依赖、泛化和实现、类的关联、聚

    《Java设计模式(第2版)》

    二、设计模式遵循的原则有6个: 1、开闭原则(Open Close Principle) 对扩展开放,对修改关闭。 2、里氏代换原则(Liskov Substitution Principle) 只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,...

    Java 23种设计模式详解

    Java 全部23种设计模式全面详解 设计模式的六大原则 1、开闭原则(Open Close Principle) 2、里氏代换原则(Liskov Substitution Principle) 3、依赖倒转原则(Dependence Inversion Principle) 4、接口隔离原则...

    java8源码-jcohy-study-sample:个人学习整理

    Ps:Java设计模式 [设计原则] [单一职责原则] [里氏替换原则] [依赖倒转原则] [接口隔离原则] [迪米特法则] [合成复用原则] 设计模式 创建型模式(5种) 结构型模式(7种) 关系型模式(11种) 适配器模式、装饰模式、代理...

    安卓java读取网页源码-JavaPattern:Java设计模式

    Java设计模式 创建型模式(对象怎么来): – 单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式。 结构型模式(对象和谁有关): – 适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。...

    Java23种基本的设计模式整料整理学习源码示例zip

    Java23种基本的设计模式整料整理学习源码示例zip Java23种基本的设计模式整料整理学习源码示例zip Java23种基本的设计模式整料整理学习源码示例zip Java23种基本的设计模式整料整理学习源码示例zip 设计模式的六大...

    JavaCodeDesign:这是Java设计模式的样本项目

    [TOC] This is a sample project of java design pattern.Inside code comes from the book of . ... 迪米特法则 lod(Least Knowledge Principle) 6. 开闭原则 ocp 设计模式 (pattern) 1. 单例模式 singleton 2.

Global site tag (gtag.js) - Google Analytics