迪米特模式
迪米特法则
定义:如果两个类之间不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某个方法,可以通过第三者转发这个调用。
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(); } }