迪米特法则的定义——如果两个类之间不必直接通信,则这两个类不应该发生直接的相互作用。如果其中一个类需要调用另一个类的某个方法,应该通过第三方来转发这个调用。
迪米特法则也称为最少知识原则(talk only to your immediate friends),就是说一个对象应该尽可能少地了解其他对象。从而降低类之间的耦合,这样做的一个可能后果是系统中存在大量的中介类,这在一定程度上会增加系统的复杂性。
迪米特法则强调的前提是在类的结构设计上,每个类都要尽量降低成员的访问权限,类自己包装好自己的private状态,不需要让别的类知道的字段或者行为就不要公开。 举个例子,古代皇帝召见御前侍卫,需要相关职能机构通知传达圣旨给手下,由手下人去通知侍卫,由认识侍卫的人介绍,然后见到侍卫传递圣旨,这里面就有多次第三方传递的过程,也就是迪米特法则的应用。
/**
* Author:小青
* Time:2017-8-27
* Function:抽象的陌生人类
*
*/
public abstract class Stranger{
public abstract void operation();
}
/**
* Author:小青
* Time:2017-8-27
* Function:侍卫
*
*/
public class Shiwei extends Stranger{
@Override
public void operation(){
System.out.println("见过皇上,我是御前侍卫,我能打十个");
}
}
/**
* Author:小青
* Time:2017-8-27
* Function:太监
*
*/
public class Taijian{
public void operation(){
System.out.println("other play");
}
public void findStranger(){
Stranger str = new Shiwei();
str.operation();
}
}
/**
* Author:小青
* Time:2017-8-27
* Function:皇帝
*
*/
public class Huangdi{
private Taijian taijian;
public Taijian getTaijian(){
return taijian;
}
public void setTaijian(Taijian taijian){
this.taijian = taijian;
}
public void operation(){
System.out.println("someone play");
}
}
public class DiMiTeTest{
public static void main(String[] args){
//声明并实例化皇帝
Huangdi kangxi = new Huangdi();
//设置一个太监的实例化对象,即找到一个转发者帮忙做事
kangxi.setTaijian(new Taijian());
//皇帝通过太监传话
kangxi.getTaijian().findStranger();
}
}
迪米特法则的根本思想,是强调类之间需要尽量多的实现松散耦合,类之间耦合越弱,越有利于复用,一个处于弱耦合的类被修改,不会对有关系的类造成波及,反之会导致很多麻烦。
以上内容,整理自刘径舟,张玉华编著的《设计模式其实很简单》读书笔记,欢迎转载.