zoukankan      html  css  js  c++  java
  • 设计模式-软件设计原则5-迪米特 法则

    迪米特原则(LawofDemeterLoD)是指一个对象应该对其他对象保持最少的了解,又叫最少知道原则(Least Knowledge Principle,LKP),尽量降低类与类之间的耦合。迪米特原则主要强调只和朋友交流,不和陌生人说话。出现在成员变量、方法的输入、输出参数中的类都可以称之为成员朋友类,而出现在方法体内部的类不属于朋友类。现在来设计一个权限系统,Boss 需要查看目前发布到线上的课程数量。这时候,Boss要找到TeamLeader去进行统计,TeamLeader再把统计结果告诉Boss。接下来我们还是来看代码:

    package com.lch.test.demeterlaw;
    
    public class Course {
    }
    1 package com.lch.test.demeterlaw;
    2 
    3 import java.util.List;
    4 
    5 public class TeamLeader {
    6     public void checkNumberOfCourses(List<Course> courseList){
    7         System.out.println("目前已发布的课程数量是"+courseList.size());
    8     }
    9 }
     1 package com.lch.test.demeterlaw;
     2 
     3 import java.util.ArrayList;
     4 import java.util.List;
     5 
     6 public class Boss {
     7     public void commandCheckNumber(TeamLeader teamLeader){
     8         //模拟boss一页一页往下翻页,teamleader实时统计
     9         List<Course> courseList = new ArrayList<>();
    10         for (int i = 0; i < 20; i++) {
    11             courseList.add(new Course());
    12         }
    13         teamLeader.checkNumberOfCourses(courseList);
    14     }
    15 }

    测试代码:

    1 package com.lch.test.demeterlaw;
    2 
    3 public class DemeterLawTest {
    4     public static void main(String[] args) {
    5         Boss boss = new Boss();
    6         TeamLeader teamLeader = new TeamLeader();
    7         boss.commandCheckNumber(teamLeader);
    8     }
    9 }

    写到这里,其实功能已经都已经实现,代码看上去也没什么问题。根据迪米特原则,Boss只想要结果,不需要跟Course 产生直接的交流。而TeamLeader统计需要引用Course对象。Boss和Course并不是朋友,从下面的类图就可以看出来:

    下面来对代码进行改造:

     1 package com.lch.test.demeterlaw;
     2 
     3 import java.util.ArrayList;
     4 import java.util.List;
     5 
     6 public class TeamLeader {
     7     public void checkNumberOfCourses(){
     8         List<Course> courseList = new ArrayList<>();
     9         for (int i = 0; i < 20; i++) {
    10             courseList.add(new Course());
    11         }
    12         System.out.println("目前已发布的课程数量是"+courseList.size());
    13     }
    14 }
     1 package com.lch.test.demeterlaw;
     2 
     3 public class Boss {
     4     public void commandCheckNumber(TeamLeader teamLeader){
     5         //模拟boss一页一页往下翻页,teamleader实时统计
     6         /*List<Course> courseList = new ArrayList<>();
     7         for (int i = 0; i < 20; i++) {
     8             courseList.add(new Course());
     9         }
    10         teamLeader.checkNumberOfCourses(courseList);*/
    11         teamLeader.checkNumberOfCourses();
    12     }
    13 }

    这时,Boss和Course已经没有直接关联了

  • 相关阅读:
    python3爬虫-爬取新浪新闻首页所有新闻标题
    Python第三方库官网
    网页图片尺寸查看方法
    jquery插件开发常用总结一
    谷歌浏览器的input自动填充出现黄色背景解决方案(在已经输入内容之后)
    在背景图上面加滤镜层之后添加内容
    你是第几位访客简单实现--大学城项目首页
    html5总结
    win10怎么修改svn的用户和密码
    properties中的编码如何生成:例如u7AD9u70B9这种
  • 原文地址:https://www.cnblogs.com/enjoyjava/p/11336567.html
Copyright © 2011-2022 走看看