设计模式七大原则之迪米特法则
什么是迪米特法则
-
迪米特法则又称为最少知道原则。
-
在类的结构设计上,每一个类都应当尽量降低成员的访问权限,每个类都应该尽量将逻辑封装在类内部,不需要外部知道的字段或行为就不应该公开。
-
类应该只与其直接朋友(成员变量、方法参数、方法返回值的类)通信,尽量避免其他类以局部变量的形式出现在类内部。
-
迪米特法则强调了类之间的松耦合,类之间的耦合度越松,越有利于复用。
举个栗子
现在A、B两个类中都有各自的一个集合,现在需要输出其各自的集合中的元素:
public class Demeter {
public static void main(String[] args) {
B b = new B();
b.print();
}
}
class A {
List<String> aInfos = null;
A() {
aInfos = new ArrayList<>();
for (int i = 0; i < 10; i++) {
aInfos.add("a" + i);
}
}
public List<String> getAllInfos() {
return this.aInfos;
}
}
class B {
List<String> bInfos = null;
B() {
bInfos = new ArrayList<>();
for (int i = 0; i < 5; i++) {
bInfos.add("b" + i);
}
}
public void print() {
System.out.println("A:");
List<String> aList = new A().getAllInfos(); //这里以A类的getAllInfos方法的返回值为局部变量,A类对于B类来说并不是直接朋友
for (String str : aList) {
System.out.println(str);
}
System.out.println("B:");
for (String str : bInfos) {
System.out.println(str);
}
}
}
我们调用了B类的print方法,输出两个类中的集合的元素,由于使用了一个局部变量,这并不符合迪米特法则。
下面的代码符合迪米特法则:
public class Demeter {
public static void main(String[] args) {
B b = new B();
b.print(new A());
}
}
class A {
List<String> aInfos = null;
A() {
aInfos = new ArrayList<>();
for (int i = 0; i < 10; i++) {
aInfos.add("a" + i);
}
}
public List<String> getAllInfos() {
return this.aInfos;
}
public void print(){
System.out.println("A:");
List<String> aList = new A().getAllInfos();
for (String str : aList) {
System.out.println(str);
}
}
}
class B {
List<String> bInfos = null;
B() {
bInfos = new ArrayList<>();
for (int i = 0; i < 5; i++) {
bInfos.add("b" + i);
}
}
public void print(A a) {
a.print();
System.out.println("B:");
for (String str : bInfos) {
System.out.println(str);
}
}
}
现在我们将以A类的列表输出功能放在了A类中,规定给B类的print方法一个参数,可以在该方法中调用A类的print方法,此时,A类成为了B类的直接朋友,遵循迪米特法则。