你是否正在寻找关于迪米特法则的内容?让我把最吸引人的东西奉献给你:
1.迪米特法则:Law of Demeter, LoD),也称最少知识原则(Least Knowledge Principle, LKP)
定义:Only talk to your immedate friends.(只与直接的朋友通信)。一个对象应该对其他对象有最少的了解。(通俗地讲,一个类应该对自己需要耦合或调用的类知道得最少)
2.理解:
2.1 只和朋友交流(更准确来讲是:直接的朋友)
每个对象都必然会与其他对象有耦合关系,两个对象之间的耦合就成为朋友关系,这种关系的类型有很多,如组合、聚合、依赖等。
朋友类的定义:出现在成员变量、方法的输入输出参数中的类,。 而方法体类内部的类不能算。
2.2 朋友之间也有间距
如果朋友把太多的方法或属性暴露给你,则过于亲密,耦合关系变得异常牢固,而且,修改时涉及的面也就越大,变更引起的风险就越大。因此,要适时反复衡量:是否可以减少public方法和属性,改为private、package-private、protected等访问权限,及是否可以加上final关键字。
3.问题由来:
类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大。[解决方案]尽量降低类与类之间的耦合。
4.使用LoD的好处:
5.难点:
6.最佳实践:
①在类的划分上,应该创建有弱耦合的类;
②在类的结构设计上,每一个类都应当尽量降低成员的访问权限;
③在类的设计上,只要有可能,一个类应当设计成不变类;
④在对其他类的引用上,一个对象对其它对象的引用应当降到最低;
⑤尽量降低类的访问权限;
⑥谨慎使用序列化功能(类或接口在客户端变更,却未在服务端同步更新,引发序列化失败,,项目管理易疏忽);
⑦不要暴露类成员,而应该提供相应的访问器(属性)。
在实际应用中经常会出现这样一个方法:放在本类中也可以,放在其他类中也没有问题,怎么去衡量呢?建议:如果一个类放在本类中,既不增加类间关系,又不对本类产生不负面影响,就放置在本类中。
7.范例:
7.1 一个常态的编程(肯定是不符LoD的反例)
//体育老老师让体委清点全班女生个数。类图如下:

对应源代码如下:
public class Teacher { //老师对学生发布命令,清一下女生 public void commond(GroupLeader groupLeader){ List<Girl> listGirls = new ArrayList(); //初始化女生 for(int i=0;i<20;i++){ listGirls.add(new Girl()); } //告诉体育委员开始执行清查任务 groupLeader.countGirls(listGirls); } } public class GroupLeader { //有清查女生的工作 public void countGirls(List<Girl> listGirls){ System.out.println("女生数量是:"+listGirls.size()); } } public class Girl { } public class Client { public static void main(String[] args) { Teacher teacher= new Teacher(); //老师发布命令 teacher.commond(new GroupLeader()); } }改如下:
7.2 依据LoD法则解耦(与真实意义上的陌生类解耦,这里而不应为上述类图中未正确体会语义的虚假朋友类Girl):

对应源码如下:
public class Teacher { //老师对学生发布命令,清一下女生 public void commond(GroupLeader groupLeader){ //告诉体育委员开始执行清查任务 groupLeader.countGirls(); } } public class GroupLeader { private List<Girl> listGirls; //传递全班的女生 public GroupLeader(List<Girl> _listGirls){ this.listGirls = _listGirls; } //有清查女生的工作 public void countGirls(){ System.out.println("女生数量是:"+listGirls.size()); } } public class Girl { } public class Client { public static void main(String[] args) { List<Girl> listGirls = new ArrayList<Girl>(); //初始化女生 for(int i=0;i<20;i++){ listGirls.add(new Girl()); } Teacher teacher= new Teacher(); //老师发布命令 teacher.commond(new GroupLeader(listGirls)); } }7.3朋友间不要过于亲密,太亲密则过于耦合。(根据情况,缩减访问控制域)
//安装软件向导示例:

本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-138-1.html
差了一代
很棒棒哒
那就让它误撞好了
当前必须完全抛售美国国债