迪米特原则
迪米特原则(Law of Demeter)又叫最少知道原则(Least Knowledge Principle),可以简单说成:talk only to your immediate friends,只与你直接的朋友们通信,不要跟“陌生人”说话。
图片.png
模式与意义
迪米特法则,如果两个类不必彼此直接通向,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个累哦的某一个方法的话,可以通过第三者转发这个调用。
迪米特法则首先强调的前提是在类的结构设计上,每一个类都应当降低成员的访问权限,也就是说,一个类包装好自己的private状态,不需要让别的类知道的字段或行为就不要公开。
面向对象的设计原则和面向对象的三大特性本就不是矛盾的。迪米特法则其根本思想,是强调了类之间的松耦合。类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成搏击,也就是说,信息的隐藏促进了软件的复用。
优点
减少对象之间的耦合性
图片.png
摘自大话设计模式:
图片.png
图片.png
图片.png
注意
在类的划分上,应该创建弱耦合的类。类与类之间的耦合越弱,就越有利于实现可复用的目标。
在类的结构设计上,尽量降低类成员的访问权限。
在类的设计上,优先考虑将一个类设置成不变类。
在对其他类的引用上,将引用其他对象的次数降到最低。
不暴露类的属性成员,而应该提供相应的访问器(set 和 get 方法)。
谨慎使用序列化(Serializable)功能
举例
明星与经纪人的关系实例
分析:明星由于全身心投入艺术,所以许多日常事务由经纪人负责处理,如与粉丝的见面会,与媒体公司的业务洽淡等。这里的经纪人是明星的朋友,而粉丝和媒体公司是陌生人,所以适合使用迪米特法则
图片.png
public class LoDtest { public static void main (String[] args ) { Agent agent=new Agent(); agent.setStar(new Star("科比" )); agent.setFans(new Fans("闰土" )); agent.setCompany(new Company("中国传媒有限公司" )); agent.meeting(); agent.business(); } }//经纪人 class Agent { private Star myStar; private Fans myFans; private Company myCompany; public void setStar (Star myStar ) { this .myStar=myStar; } public void setFans (Fans myFans ) { this .myFans=myFans; } public void setCompany (Company myCompany ) { this .myCompany=myCompany; } public void meeting ( ) { System.out .println(myFans.getName()+"与明星" +myStar.getName()+"见面了。" ); } public void business ( ) { System.out .println(myCompany.getName()+"与明星" +myStar.getName()+"洽淡业务。" ); } }//明星 class Star { private String name; Star(String name) { this .name=name; } public String getName ( ) { return name; } }//粉丝 class Fans { private String name; Fans(String name) { this .name=name; } public String getName ( ) { return name; } }//媒体公司 class Company { private String name; Company(String name) { this .name=name; } public String getName ( ) { return name; } }