迪米特法则

290 阅读2分钟

这是我参与8月更文挑战的第27天,活动详情查看:8月更文挑战

什么是迪米特法则?

迪米特法则(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("断电");
	    }

}

优点

减低类的耦合,每个类尽量减少对其他类的依赖

容易使模块的功能独立,相互之间不存在或者很少有依赖关系

缺点

会产生大量的小方法,这些方法只是为了传递间接的调用,和业务逻辑无 关。 局部设计简化,但是会使不同模块的通信效率降低,不易协调。