面向对象设计原则——迪米特法则(LoD)
tags:设计模式
A. Each each should have only limited knowledge about other units:only units closely related to current unit.
B. Each unit should only talk to its friends; dont’t talk to strange.
C. Only talk to your immediate friends.
原则简介
迪米特法则又称为知识最少原则,但一般实现过程中只实现上述的C点的要求,其实它还有两层意思,就是要让调用者对于目标对象的知识了解最少,而且不和陌生人交谈.
迪米特法则要求不与非友的类直接建立联系,即便联系都是友也要和最亲密的友联系,并且联系的时候最好不要谈隐私(专门类型),要与一些相对广为人知的知识进行交互.
实例说明
Only talk to your immediate friends
设计模式在设置和引入类型时,也一直潜移默化地实践着各项原则,如前面面里氏替换原则和依赖倒置原则的例子,客户程序不希望知道Bicycle怎么跑,Train怎么跑,它只希望知道能run就可以了,虽然做到了依赖倒置,但其中似乎少了一个中间环节–客户程序如何找到或者被找到这样一个Vehicle呢?一般我们会定义一个工厂类型或者通过注入机制让客户程序找到或者被找到一个Vehicle实例,这时工厂类型和Vehicle接口就成了客户程序的密友
class Client{
@inject
//或使用factory找到
Vehicle vehicle;
void showAVehicle(Vehicle vehicle);
}
class interface Vehicle{
void run();
}
clsaa Bicycle implement Vehicle{
void run(){}
}
clsaa Train implement Vehicle{
void run(){}
}
class VehicleFactory{
Vehicle newInstance(){
if(..)
return new Bicycle();
if(..)
return new Train();
}
}
在这可以看出,陌生与亲密是相对的,客户端程序之所以能够认识Vehice而不认识Bicycle和Train是因为有了工厂类型,而工厂类型自己则是Bicycle和Train的熟人,迪米特法则在现实生活中最直接的体现就是人脉,不同点在于迪米特法则希望的是人脉窄而现实中希望人脉宽,路子广
Only units closely related to current unit
迪米特法则还希望知识最少,因此细究下去除了关联关系外,还涉及关联手段和关联过程,例如同样访问信息源,尽管逻辑上双方都属于近最的关联关系,但协议不同,也会导致有的信息源使用时不那么方便,这时称他们为最近的陌生人,为此要在中间补充一个对象,帮助他们建立联系.
例如在验证实体类型 的数据结构时有两种选择:
方案一:客户程序知道单证的编号,除此之外其他不知道:
checkForm(String formID);方案二:客户程序知道实体类型,包括这个类型中具有Master-Detail关系的内容:
checkForm(Form form);两个方案中,前者客户程序需要知道更多,后者知道的相对较少.对于企业内部系统或许两个选择差距不大,但是对于集成项目,外包项目,这层的要求就显得非常有意义了.