设计模式六大原则
定义:
迪米特法则(Law of Demeter)又叫做最少知识原则(Least Knowledge Principle 简写LKP),就是说一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。英文简写LoD。
来源历史:
1987年秋天由美国Northeastem University 的 lan Holland 提出,被UML的创始者之一Booch等普及。后来,因为在经典著作《The Pragmatic Programmer》而广为人知。
具体举一个例子:
比方说我们家的孩子5岁,想去学校读书,我们要调查学校有多少个适合教5岁孩子的老师。(当前适合教5岁孩子的老师要求:性别女,年龄30岁以下,未婚)
1. 那么我们实现第一步就是创建一个Teacher类:
public class Teacher {
public static int MAN =1;
public static int WOMEN =2;
private int gender;
private int age;
private boolean is_marry;
private String name;
public int getGender() {
return gender;
}
public int getAge() {
return age;
}
public boolean isIs_marry() {
return is_marry;
}
public String getName() {
return name;
}
public void setGender(int gender) {
this.gender = gender;
}
public void setAge(int age) {
this.age = age;
}
public void setIs_marry(boolean is_marry) {
this.is_marry = is_marry;
}
public void setName(String name) {
this.name = name;
}
}
2. 第二步就是创建所有教师的名单:(随便写的,别在意细节。。。)
public List<Teacher> list = new ArrayList<>();
for(int i = 0;i<100;i++){
//添加不同教师的资料
Teacher teacher = new Teacher();
teacher.setAge(i+20);
if(i<50){
teacher.setGender(Teacher.WOMEN);
}else{
teacher.setGender(Teacher.MAN);
}
teacher.setIs_marry(false);
teacher.setName("教师"+i);
list.add(teacher);
}
3. 第三步就是家长过来查看老师的信息了,每个老师都要实现以下逻辑:
//查找合适的教师
for(Teacher teacher:list){
if(teacher.getGender() == Teacher.WOMEN
&&teacher.getAge()<30
&&!teacher.isIs_marry()){
Log.w("给您推荐的教师姓名:",teacher.getName());
}
}
4. 然后学校发现这样的条件太苛刻了,只要是30岁以下的教师都可以教好孩子,无论男女合适否婚配。这种条件下让每个家长都修改自己的逻辑显然是不合适的。那么就引出了今天的主角:迪米特法则!
所以接下来我们要做的就是,家长不用了解什么样的教师适合教5岁的孩子,这些规则都在校方评定的时候就存在于教师的属性中。他们只需要了解该教师是否适合教5岁的孩子,以及教师的姓名。
5. 我们来修改Teacher类:
public class Teacher {
public static int MAN =1;
public static int WOMEN =2;
private int gender;
private int age;
private boolean is_marry;
private String name;
public void setGender(int gender) {
this.gender = gender;
}
public void setAge(int age) {
this.age = age;
}
public void setIs_marry(boolean is_marry) {
this.is_marry = is_marry;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public boolean isSuitable(){
if(age<30) return true;
return false;
}
}
6. 那么家长这边也要换一下逻辑:
//查找合适的教师
for(Teacher teacher:list){
if(teacher.isSuitable()){
Log.w("给您推荐的教师姓名:",teacher.getName());
}
}