设计模式:六大原则之迪米特原则

迪米特原则

基本介绍

定义:迪米特法则也称为最少知识原则,即一个对象应该对其他对象有最少的了解。通俗地说,一个类应该对自己需要耦合或调用的类知道的最少,被调用或耦合的类的内部是如何复杂都和我没有关系。
一个类只需要知道人家提供多少public方法,我就调用多少,其他的一概不关心。
核心观念-》类间解耦
迪米特法则对类的低耦合提出了明确的要求,包含以下4层含义:
①只和朋友交流:
迪米特法则的另一个解释是:是与直接的朋友通信
朋友关系是什么:每个对象必然会与其他对象有耦合关系,两个对象之间的耦合关系就成为朋友关系,这种关系的类型有很多,例如组合、聚合、依赖等。
直接朋友是什么?出现在成员变量、方法的输入输出参数中的类称为成员朋友类,而出现在方法体内部的类不属于朋友类
②朋友之间也是有距离的:
一个类公开的public属性或者方法越多,修改时涉及的面也就越大,变更引起的风险扩散也就越大。所以,在设计时要反复衡量:是否换可以再减少public方法和属性,是否可以修改为private、protected等访问权限,是否可以加上final关键字。
③是自己的就是自己的
如果一个方法放在本类中,既不增加类间关系,也对本类不产生负面影响,那就放在本类中
package com.cxq.demeter;
import java.util.ArrayList;
import java.util.List;

public class Demeter1 {
    public static void main(String[] args) {
        SchoolManager schoolManager=new SchoolManager();
        schoolManager.printAllEmployee(new CollegeManager());
    }
}
/*
* 学校总部员工
* */
class Employee{
    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}
/*
* 学院员工
* */
class CollegeEmployee{
    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}
/*
* 管理学院的员工类
* */
class CollegeManager{
    /*
    * 返回学院的所有员工
    * */
    public List<CollegeEmployee> getAllEmployee(){
        ArrayList<CollegeEmployee> list=new ArrayList<>();
        //模拟10个学院员工
        for (int i=0;i<10;i++){
            CollegeEmployee collegeEmployee=new CollegeEmployee();
            collegeEmployee.setId("学院员工id="+i);
            list.add(collegeEmployee);
        }
        return list;
    }

}
/*
* 管理学校员工的类
* 分析出那些类不是SchoolManager的直接朋友
* 1、collegeEmployee不是直接朋友
* */
class SchoolManager{
    /*
    * 返回学校总部的所有员工
    * */
    public List<Employee> getAllEmployee(){
        ArrayList<Employee> list=new ArrayList<>();
        //模拟10个学院员工
        for (int i=0;i<10;i++){
            Employee employee=new Employee();
            employee.setId("学校总部的员工id="+i);
            list.add(employee);
        }
        return list;
    }
    public void printAllEmployee(CollegeManager collegeManager){
        //打印学校和学院的所有员工
        List<CollegeEmployee> list1=collegeManager.getAllEmployee();
        System.out.println("============学院员工============");
        for (CollegeEmployee collegeEmployee : list1) {
            System.out.println(collegeEmployee);
        }
        List<Employee> list2=this.getAllEmployee();
        System.out.println("============学校总部员工============");
        for (Employee employee : list2) {
            System.out.println(employee);
        }
    }
}

1、分析SchoolManager的直接朋友:
成员变量、方法参数、方法返回值
Employee、CollegeManager是CollegeEmployee不是成员变量,不是方法参数,不是返回值是以局部变量的方式出现在SchoolManager中
2、总结:问题主要出现在SchoolManager类的printAllEmployee方法中使用了CollegeEmployee类,这里的CollegeEmployee类是非朋友关系,违反了迪米特法则
修改:

package com.cxq.demeter;
import java.util.ArrayList;
import java.util.List;

public class Demeter1 {
    public static void main(String[] args) {

    }
}
/*
* 学校总部员工
* */
class Employee{
    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}
/*
* 学院员工
* */
class CollegeEmployee{
    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}
/*
* 管理学院的员工类
* */
class CollegeManager{
    /*
    * 返回学院的所有员工
    * */
    public List<CollegeEmployee> getAllEmployee(){
        ArrayList<CollegeEmployee> list=new ArrayList<>();
        //模拟10个学院员工
        for (int i=0;i<10;i++){
            CollegeEmployee collegeEmployee=new CollegeEmployee();
            collegeEmployee.setId("学院员工id="+i);
            list.add(collegeEmployee);
        }
        return list;
    }
    /**
     * 将原来在SchoolManager中的代码提取到自己类中
     */
    public void printEmployee(){
        List<CollegeEmployee> list1=this.getAllEmployee();
        System.out.println("============学院员工============");
        for (CollegeEmployee collegeEmployee : list1) {
            System.out.println(collegeEmployee);
        }
    }
}
/*
* 管理学校员工的类
* 分析出那些类不是SchoolManager的直接朋友
* 1、collegeEmployee不是直接朋友
* */
class SchoolManager{
    /*
    * 返回学校总部的所有员工
    * */
    public List<Employee> getAllEmploypackage com.cxq.demeter;
import java.util.ArrayList;
import java.util.List;

public class Demeter1 {
    public static void main(String[] args) {
        SchoolManager schoolManager=new SchoolManager();
        schoolManager.printAllEmployee(new CollegeManager());
    }
}
/*
* 学校总部员工
* */
class Employee{
    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}
/*
* 学院员工
* */
class CollegeEmployee{
    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}
/*
* 管理学院的员工类
* */
class CollegeManager{
    /*
    * 返回学院的所有员工
    * */
    public List<CollegeEmployee> getAllEmployee(){
        ArrayList<CollegeEmployee> list=new ArrayList<>();
        //模拟10个学院员工
        for (int i=0;i<10;i++){
            CollegeEmployee collegeEmployee=new CollegeEmployee();
            collegeEmployee.setId("学院员工id="+i);
            list.add(collegeEmployee);
        }
        return list;
    }
    /**
     * 将原来在SchoolManager中的代码提取到自己类中
     */
    public void printEmployee(){
        List<CollegeEmployee> list1=this.getAllEmployee();
        System.out.println("============学院员工============");
        for (CollegeEmployee collegeEmployee : list1) {
            System.out.println(collegeEmployee);
        }
    }
}
/*
* 管理学校员工的类
* 分析出那些类不是SchoolManager的直接朋友
* 1、collegeEmployee不是直接朋友
* */
class SchoolManager{
    /*
    * 返回学校总部的所有员工
    * */
    public List<Employee> getAllEmployee(){
        ArrayList<Employee> list=new ArrayList<>();
        //模拟10个学院员工
        for (int i=0;i<10;i++){
            Employee employee=new Employee();
            employee.setId("学校总部的员工id="+i);
            list.add(employee);
        }
        return list;
    }
    public void printAllEmployee(CollegeManager collegeManager){
        //打印学校和学院的所有员工
       collegeManager.printEmployee();
        List<Employee> list2=this.getAllEmployee();
        System.out.println("============学校总部员工============");
        for (Employee employee : list2) {
            System.out.println(employee);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值