天天看点

设计模式六大原则(六)迪米特法则

设计模式六大原则

定义:

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

这样修改之后的好处就是:无论怎么修改匹配的教师规则,都不需要家长这边修改逻辑了。这也是迪米特法则的意思:家长要尽量少的去了解教师的属性。