Android设计模式六大原则之迪米特原则
迪米特原则又被称为 最少知识原则,意思就是说呢,一个对象应该对其他对象有最少的了解。我们知道,一个类如果太依赖另一个类,那么他们之间耦合度就会很大,当一个类发生改变时,对另一个类产生的影响也会很大的。
迪米特法则还有一个更简单的定义:只与直接的朋友通信
迪米特原则遵循编程原则 :高内聚,低耦合。 只有使各个模块之间的耦合尽量的低,才能提高代码的复用率。
好了,定义和规则我们也都知道了,那接下来我们就场景配合代码示例来讲讲怎么运用迪米特原则。
在学校里,有校长,班级(班主任),学生等几种角色,校长想要了解某个班学生的本学期考试的学习成绩和其他情况。
假如在不遵循迪米特原则的情况下:
(1)定义学生类
//学生类
public class Student {
private int id;//学生编号
private String name;//学生姓名
private float score;//学生分数
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getScore() {
return score;
}
public void setScore(float score) {
this.score = score;
}
}
(2)定义班级类
//班级类
public class Class {
public int id;//班级编号
public String className;//班级名称
public List<Student> studentList;//学生列表
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public List<Student> getStudentList() {
return studentList;
}
public void setStudentList(List<Student> studentList) {
this.studentList = studentList;
}
}
(3)定义校长类,可以打印获得某个班超过指定分数的同学,也可以获得某个班的优异比例
//校长类
public class HeadMaster {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//打印超过指定分数的学生
public void printStudentsByScore(float score, Class c) {
List<Student> students = c.getStudentList();
for (Student s : students) {
if (s.getScore() >= score) {
System.out.println(c.getClassName() + s.getName() + " : " + s.getScore());
}
}
}
//打印学生考分优异比例
public void printExcellentProportion(float score, Class c) {
List<Student> students = c.getStudentList();
int total = students.size();//学生总数
int num = 0;//用来记录超过指定分数的学生数量
for (Student s : students) {
if (s.getScore() >= score) {
num++;
}
}
float excellentProportion = (float) num / total;
DecimalFormat df = new DecimalFormat("##0.00");
System.out.println(c.getClassName() + " 优异分数占比 : " + df.format(excellentProportion));
}
}
完成任务是没问题,但是某天校长说:累死我了,一到六年级,每个年级四个班,只查看每个班的优异比例都够累的,其他的工作根本没法展开。
我们看下,问题出在了哪里,校长跟学生之间的接触太多了,什么事情都亲力亲为,那一个学校,只要你一个校长就够了。很显然这肯定是不行的。按照迪米特原则,我们应该怎么改进呢,学生和班主任是直接沟通的,班主任和校长是直接沟通的。那么校长和学生之间几乎是没有什么沟通的。那么可以按照迪米特原则这样改。
这样,之前校长多做的事情由负责班级的班主任来做。实现各尽其责。
//班级类
public class Class {
public int id;//班级编号
public String className;//班级名称
public List<Student> studentList;//学生列表
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public List<Student> getStudentList() {
return studentList;
}
public void setStudentList(List<Student> studentList) {
this.studentList = studentList;
}
//打印超过指定分数的学生
public void printStudentsByScore(float score) {
List<Student> students = this.studentList;
for (Student s : students) {
if (s.getScore() >= score) {
System.out.println(this.className + s.getName() + " : " + s.getScore());
}
}
}
//打印学生考分优异比例
public void printExcellentProportion(float score) {
List<Student> students = this.studentList;
int total = students.size();//学生总数
int num = 0;//用来记录超过指定分数的学生数量
for (Student s : students) {
if (s.getScore() >= score) {
num++;
}
}
float excellentProportion = (float) num / total;
DecimalFormat df = new DecimalFormat("##0.00");
System.out.println(this.className + " 优异分数占比 : " + df.format(excellentProportion));
}
}
接下来校长,只需要向指定班级的班主任,询问获取结果即可。
//校长类
public class HeadMaster {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//打印超过指定分数的学生
public void printStudentsByScore(float score, Class c) {
c.printStudentsByScore(score);
}
//打印学生考分优异比例
public void printExcellentProportion(float score, Class c) {
c.printExcellentProportion(score);
}
public void doOtherTask(){
System.out.print("我终于可以有时间做其他工作了");
}
}
我们看校长,询问班主任学生学习情况,很方便了,而且,当家长问起学生所在班级情况的时候也很方便了,因为这些班主任自己已经了如执掌了,不再像之前对自己的班级一问三不知了。
其实在我们工作中,这种场景也非常多,比如用户,开发人员,领导。领导想知道,这个月用户的访问记录,不同年龄段的人群占比。
你直接按照要求将访问记录导出来发送给了领导,那领导还不疯了,这么多记录,他什么也不用干了。
相反如果,遵循迪米特原则,开发人员是直接接触用户访问记录的,那么如果他将这些数据进行统计分类,且不说给一个扇形或者柱状图,即使用语言描述出来,领导看完,也只是分分钟钟的事情,这样才能顺利高效的进行下一步,对吧。
写在最后:改变世界,先从改变自己开始。—我说的
你也可以关注我的公众号:码H.cam , 随时随地学习设计模式