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已经没有直接关联了

  • 相关阅读:
    C# DataGridview转换为DataTable
    未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序
    ORM(Object Relational Mapping)框架
    C#开发小技巧
    Windows系统中Oracle11g R2 版本数据库卸载
    world特殊控制符输入
    Java中生成帮助文档
    Java类——JDBC链接、并操作MySQL数据库
    Java——实现对密码进行MD5加密
    HTTP协议详解
  • 原文地址:https://www.cnblogs.com/enjoyjava/p/11336567.html
Copyright © 2011-2022 走看看