程序员架构算法设计模式和编程理论Android知识

Android设计模式六大原则之迪米特原则

2019-04-17  本文已影响68人  HCam

迪米特原则又被称为 最少知识原则,意思就是说呢,一个对象应该对其他对象有最少的了解。我们知道,一个类如果太依赖另一个类,那么他们之间耦合度就会很大,当一个类发生改变时,对另一个类产生的影响也会很大的。

迪米特法则还有一个更简单的定义:只与直接的朋友通信

迪米特原则遵循编程原则 :高内聚,低耦合。 只有使各个模块之间的耦合尽量的低,才能提高代码的复用率。

好了,定义和规则我们也都知道了,那接下来我们就场景配合代码示例来讲讲怎么运用迪米特原则。

在学校里,有校长,班级(班主任),学生等几种角色,校长想要了解某个班学生的本学期考试的学习成绩和其他情况。

假如在不遵循迪米特原则的情况下:

(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 , 随时随地学习设计模式

上一篇下一篇

猜你喜欢

热点阅读