设计模式七大设计原则之迪米特法则

设计模式七大设计原则之迪米特法则(Demeter Principle)

1.迪米特法则介绍

  1. 一个对象应该对其他对象保持最少的了解
  2. 也叫最少知道原则
  3. 陌生类最好不要以局部变量的形式出现在类的内部
  4. 只与直接朋友进行通信,直接朋友包括成员变量,方法参数,方法返回值的类。

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());
        }
    }
}

运行结果:
在这里插入图片描述
小结:
迪米特法则又称最少知道原则,尽量做到减少类之间的耦合度。

七大设计原则汇总:七大设计原则汇总

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值