设计模式七大设计原则之迪米特法则(Demeter Principle)
1.迪米特法则介绍
- 一个对象应该对其他对象保持最少的了解
- 也叫最少知道原则
- 陌生类最好不要以局部变量的形式出现在类的内部
- 只与直接朋友进行通信,直接朋友包括成员变量,方法参数,方法返回值的类。
2.案例分析
场景: 有四个实体类,专业类Profession,班级类Clazz,专业管理类ProfessionManager,班级管理类Clazz,现在分析以下实现输出所有专业和所有班级案例所存在的问题。
类图:
代码实现:
package com.ldx.demeter;
import java.util.ArrayList;
import java.util.List;
public class Demeter {
public static void main(String[] args) {
ProfessionManager professionManager=new ProfessionManager();
professionManager.printAllProfession();
professionManager.printAllClazzByPro_id();
}
}
class Profession{
Integer id;
List<Clazz> clazzList=new ArrayList<>();
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
}
class Clazz{
Integer id;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
}
class ProfessionManager{
List<Profession> professionList=new ArrayList<>();
public List<Profession> getAllProfession(){
for(int i=0;i<4;i++){
Profession profession=new Profession();
profession.setId(i);
professionList.add(profession);
}
return professionList;
}
public void printAllProfession(){
List<Profession> allProfession = getAllProfession();
for (Profession profession:allProfession){
System.out.println("专业 "+profession.getId());
}
}
//演示通过id查询班级,为了方便,直接输出所有班级
public void printAllClazzByPro_id(){
ClazzManager clazzManager=new ClazzManager();
List<Clazz> allClazz = clazzManager.getAllClazz();
for (Clazz clazz:allClazz){
System.out.println("班级 "+clazz.getId());
}
}
}
class ClazzManager{
List<Clazz> clazzList=new ArrayList<>();
public List<Clazz> getAllClazz(){
for(int i=0;i<10;i++){
Clazz clazz=new Clazz();
clazz.setId(i);
clazzList.add(clazz);
}
return clazzList;
}
}
运行结果:
存在问题: ProfessionManager不应该对ClazzManager和Clazz同时产生依赖,这样增加了程序的耦合度,而且Clazz作为局部变量出现也违背了迪米特法则。
解决方案: 将ProfessionManager中的printAllClazzByPro_id的实现移到ClazzManager中,ProfessionManager只要调用ClazzManager即可,不需要与Clazz产生依赖。
类图
代码实现:
package com.ldx.demeter.com.ldx.demeter.improve;
import java.util.ArrayList;
import java.util.List;
public class Demeter {
public static void main(String[] args) {
ProfessionManager professionManager = new ProfessionManager();
professionManager.printAllProfession();
professionManager.printAllClazzByPro_id();
}
}
class Profession {
Integer id;
List<Clazz> clazzList = new ArrayList<>();
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
}
class Clazz {
Integer id;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
}
class ProfessionManager {
List<Profession> professionList = new ArrayList<>();
ClazzManager clazzManager=new ClazzManager();
public List<Profession> getAllProfession() {
for (int i = 0; i < 4; i++) {
Profession profession = new Profession();
profession.setId(i);
professionList.add(profession);
}
return professionList;
}
public void printAllProfession() {
List<Profession> allProfession = getAllProfession();
for (Profession profession : allProfession) {
System.out.println("专业 " + profession.getId());
}
}
//演示通过id查询班级,为了方便,直接输出所有班级
public void printAllClazzByPro_id() {
clazzManager.printAllClazzByPro_id();
}
}
class ClazzManager {
List<Clazz> clazzList = new ArrayList<>();
public List<Clazz> getAllClazz() {
for (int i = 0; i < 10; i++) {
Clazz clazz = new Clazz();
clazz.setId(i);
clazzList.add(clazz);
}
return clazzList;
}
//演示通过id查询班级,为了方便,直接输出所有班级
public void printAllClazzByPro_id() {
List<Clazz> allClazz = getAllClazz();
for (Clazz clazz : allClazz) {
System.out.println("班级 " + clazz.getId());
}
}
}
运行结果:
小结:
迪米特法则又称最少知道原则,尽量做到减少类之间的耦合度。
七大设计原则汇总:七大设计原则汇总