设计模式学习笔记七、迪米特法则

一、介绍

1、迪米特法则(Law of Demeter)又叫作最少知识原则(Least Knowledge Principle 简写LKP),一个类对于其他类知道的越少越好,就是说一个对象应当对其他对象有尽可能少的了解,只和朋友通信,不和陌生人说话。英文简写为: LoD.

2、一个对象应该对其他对象保持最少了解。

3、类与类的关系越密切耦合度越大

4、与直接对象交换信息、直接朋友。(成员、类内部方法的参数、类方法的返回值)

5、陌生的类最好不要以局部变量的形式出现在类的内部。

6、迪米特法则是降低类与类之间的耦合。

二、代码

1、演示

package com.hao.demo.design.demeter;

import lombok.Data;

import java.util.ArrayList;
import java.util.List;

/**
 * @author haoxiansheng
 * @date 2020-05-12
 */
public class Demeter {
    public static void main(String[] args) {
        CompanyManager companyManager = new CompanyManager();
        companyManager.printAllEmployee(new CollegeManager());
    }
}

// 公司总部员工
@Data
class Employee {
    private String id;

    public Employee(String id) {
        this.id = id;
    }
}

// 某部门员工
@Data
class CollegeEmployee {
    private String id;

    public CollegeEmployee(String id) {
        this.id = id;
    }
}

// 管理类
class CollegeManager {
    public List<CollegeEmployee> getAllEmployee() {
        List<CollegeEmployee> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            CollegeEmployee collegeEmployee = new CollegeEmployee(i + "");
            list.add(collegeEmployee);
        }
        return list;
    }

}

// 公司总部员工
class CompanyManager {

    public List<Employee> getAllEmployee() {
        List<Employee> list = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            Employee employee = new Employee(i + "");
            list.add(employee);
        }
        return list;
    }

    // 违反了迪米特法则 局部变量出现在方法中
    public void printAllEmployee(CollegeManager collegeManager) {
        // 获取公司某部门员工并输出
       List<CollegeEmployee> list = collegeManager.getAllEmployee();  // CollegeEmployee 不是直接朋友
       list.forEach(System.out::println);
        // 获取总部员工并输出
        this.getAllEmployee().forEach(System.out::println);
    }

}

2、改进

package com.hao.demo.design.demeter;

import lombok.Data;

import java.util.ArrayList;
import java.util.List;

/**
 * @author haoxiansheng
 * @date 2020-05-12
 */
public class ImproveDemeter {
    public static void main(String[] args) {
        CompanyManager companyManager = new CompanyManager();
        companyManager.printAllEmployee(new CollegeManager());
    }
}
// 公司总部员工
@Data
class Employee2 {
    private String id;

    public Employee2(String id) {
        this.id = id;
    }
}

// 某部门员工
@Data
class CollegeEmployee2 {
    private String id;

    public CollegeEmployee2(String id) {
        this.id = id;
    }
}

// 管理类
class CollegeManager2 {
    public List<CollegeEmployee2> getAllEmployee() {
        List<CollegeEmployee2> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            CollegeEmployee2 collegeEmployee = new CollegeEmployee2(i + "");
            list.add(collegeEmployee);
        }
        return list;
    }

    public void printCollegeEmployee2(){
        // 获取公司某部门员工并输出
        List<CollegeEmployee2> list = this.getAllEmployee();  // CollegeEmployee 不是直接朋友
        list.forEach(System.out::println);
    }

}

// 公司总部员工
class CompanyManager2 {

    public List<Employee> getAllEmployee() {
        List<Employee> list = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            Employee employee = new Employee(i + "");
            list.add(employee);
        }
        return list;
    }

    // 解决方法
    public void printAllEmployee(CollegeManager collegeManager) {

        collegeManager.getAllEmployee();  // 我只要输出其他的我不需要知道

        // 获取总部员工并输出
        this.getAllEmployee().forEach(System.out::println);
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值