迪米特法则
什么是迪米特法则?
迪米特法则(Law of Demeter)又叫作最少知识原则,最少知道原则(The Least Knowledge Principle),一个对象应当对其他对象有尽可能少的了解,只和朋友通信,不和陌生人说话。英文简写为: LOD。
是“朋友”的情况
1)当前对象本身(this)
2)以参量形式传入到当前对象方法中的对象
3)当前对象的实例变量直接引用的对象
4)当前对象的实例变量如果是一个聚集(比如说List< Node >),那么聚集中的元素也都是朋友
5)当前对象所创建的对象
不是“朋友”的情况
class A{
public B getB() {
return new B();
}
}
class B{
public void methodB() {
}
}
public class NotFriendsTest {
public void test() {
A a=new A();
B b=a.getB(); //这个时候通过a调用方法返回的b就不是朋友
b.methodB();//这个时候就不符合
changeFriends(b); //只能再写一个方法把b作为参数传入调用b的方法
}
public void changeFriends(B b) {
b.methodB();
}
}
例子
电脑关机
违反迪米特原则的写法
public class Person {
public static void main(String[] args) {
Computer computer=new Computer();
computer.closeProcess();
computer.closeScreen();
computer.outage();
}
}
class Computer{
public void closeProcess() {
System.out.println("关闭进程");
}
public void closeScreen() {
System.out.println("关闭屏幕");
}
public void outage() {
System.out.println("断电");
}
}
正确写法
public class Person {
public static void main(String[] args) {
Computer computer=new Computer();
computer.close();
}
}
class Computer{
public void close() {
closeProcess();
closeScreen();
outage();
}
private void closeProcess() {
System.out.println("关闭进程");
}
private void closeScreen() {
System.out.println("关闭屏幕");
}
private void outage() {
System.out.println("断电");
}
}
优点
- 减低类的耦合,每个类尽量减少对其他类的依赖
- 容易使模块的功能独立,相互之间不存在或者很少有依赖关系
缺点
- 会产生大量的小方法,这些方法只是为了传递间接的调用,和业务逻辑无
关。 - 局部设计简化,但是会使不同模块的通信效率降低,不易协调。