迪米特法则(Low of Demeter)
又叫做最少知识原则(Least Knowledge Principle,LKP)它是指一个对象应当对其他的对象有尽可能少的了解,不必与不认识的人直接联系。要求每个方法只能给有限的对象发送消息。包括参数,(this)伪对象和this的直接子对象。
狭义:如果两个类不直接通信,那么这两个类就不应该发生直接的相互作用,如果一个类想要调用另一个类的方法,可以通过第三方转发这个调用。
广义:一个模块设计的好坏,一个重要的标志就是该模块在多大的程度上把自己内部数据和实现的有关细节隐藏起来。
优势:
有利于减低类与类之间的耦合度,由于类与类之间去除了依赖关系,各个软件功能模块相互独立。
遵循迪米特法则设计的模块,如果系统需要扩展,更加符合开闭原则对修改关闭的要求。
将内部数据和实现细节隐藏,从而使各个功能模块达到提高代码的可维护性和可重用性。
例如,假如有一个MaterialManager对象,该对象有一个方法接收了一个Tub对象作为参数,Tub对象有一个属性Location,该属性返回了一个Machine对象。用来表示桶放置的位置。假设在MaterialManager方法中,你想知道桶放置的位置,可能在代码中这样写:
if(tub.getLocation().isUp()){}
// 这就违反了迪米特法则,因为location对象有任何的变化都有可能导致程序出错,若是location对象为空,则该方法会抛出异常。
所以需要统一的地方管理这些潜在的问题,避免在多个地方重用。
在spring中的运用:
IOC作为spring框架的核心部分,无需使用编码就可以对各类程序之间进行控制,并且是可以通过容器即可进行管理,需要注意的是,IOC容器能够提供了组件需要运行的环境,
并且对组件的有关声明周期进行维护和指导。
例如:组件X依赖于组件Y,组件Y掌握了控制权,但是应用程序无需了解依赖的具体实现,只需创建某种服务的相关对象进行松散耦合。
例如:在解放前中共地下组织实行的单线联系方式,某男性党员只需与联络人联络,联络人只需与某女性党员直接联系。
//男性党员
public class SomeMan
{
private LinkMan linkMan;
public LinkMan getLinkMan()
{
return linkMan;
}
public void setLinkMan(LinkMan linkMan)
{
this.linkMan = linkMan;
}
public void play(LinkMan linkMan)
{
//
}
}
//联络人
public class LinkMan
{
public void play()
{
//
}
public String playWithSomeGirl()
{
SomeGril someGril = new SomeGril();
String msg = "aaaa";
someGril.play(msg);
}
}
//接口类
public interface IGril
{
public String play(String msg);
}
//实现类,女性党员
public class SomeGril implements IGril
{
public String play(String msg)
{
//
return msg;
}
}
//测试类
public class SuccessRun
{
public static void main(String[] args)
{
SomeMan jerry = new SomeMan();
jerry.setLinkMan(new LinkMan());
if(jerry.getLinkMan()!=null)
{
jerry.getLinkMan().playWithSomeGirl();
}
}
}