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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容