迪米特模式

迪米特法则

定义:如果两个类之间不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某个方法,可以通过第三者转发这个调用。

UML图

迪米特模式

设计模式实例

在本例子中,采用学校,班级,以及学生的形式来组成。
首先我们可以分析,学校和学生之间不应该是具有直接的联系。学校应该是由班级组成,然后每个班级里面包含各种各样的学生。那么按照Law of Demeter,可以设计出如下的代码关系:

School Class

public class School{
    private String schoolName;
    private List<ClassName> classList;
​
    public School(String schoolName) {
        this.schoolName = schoolName;
    }
​
    public List<ClassName> getClassList() {
        return classList;
    }
​
    public void setClassList(List<ClassName> classList) {
        this.classList = classList;
    }
​
    public void print() {
        System.out.println("Manage "+this.schoolName);
        for (ClassName c:this.classList){
            System.out.println(this.schoolName+" manage "+c.getClassId());
        }
    }
}

Student Class

public class Student{
    /**
     * 学生由姓名,学号组成
     */
    private String id;
    private String name;
​
    public Student(String id, String name) {
        this.id = id;
        this.name = name;
    }
​
    public String getId() {
        return id;
    }
​
    public String getName() {
        return name;
    }
}

ClassName Class

public class ClassName{
    private String classId;
    private List<Student> studentList;
​
    public ClassName(){}
​
    public String getClassId() {
        return classId;
    }
​
    public void setClassId(String classId) {
        this.classId = classId;
    }
​
    public List<Student> getStudentList() {
        return studentList;
    }
​
    public void setStudentList(List<Student> studentList) {
        this.studentList = studentList;
    }
​
    public void print() {
        for (Student student:this.studentList){
            System.out.println(this.classId+" manage "+student.getName());
        }
    }
}

Client Class

public class ClientA {
    public static void main(String[] args) {
        /**
         * 三个学生归属于两个班级
         * */
        List<Student> studentList1=new ArrayList<>();
        List<Student> studentList2=new ArrayList<>();
        Student student1=new Student("1","张三");
        Student student2=new Student("11","李四");
        Student student3=new Student("22","王五");
        studentList1.add(student1);
        studentList1.add(student2);
        studentList2.add(student3);
​
        /**
         * 两个班级归属于学校
         * */
        List<ClassName> schoolList=new ArrayList<>();
        ClassName class1=new ClassName();
        class1.setStudentList(studentList1);
        class1.setClassId("1");
        ClassName class2=new ClassName();
        class2.setStudentList(studentList2);
        class2.setClassId("2");
        schoolList.add(class1);
        schoolList.add(class2);
        class1.print();
        class2.print();
​
        School school=new School("菜鸟学校");
        school.setClassList(schoolList);
        school.print();
    }
}