设计模式七大原则之迪米特法则(最少知道原则)

概述

定义:一个类对于其他类知道的越少越好,一个对象应当对其他对象有尽可能少的了解

从迪米特法则的定义和特点可知,它强调以下两点:

  1. 从依赖者的角度来说,只依赖应该依赖的对象。
  2. 从被依赖者的角度说,只暴露应该暴露的方法。

案例演示

计算机关机案例:当我们点击计算机关机按钮的时候,计算机会执行一系列的动作,比如:保存当前未完成的任务,关闭相关的服务,接着关闭显示屏,关闭电源,这些都完成后,计算机正式关闭。

违反迪米特法则的实现

Computer类:

public class Computer {
    public void saveData() {
        System.out.println("保存数据");
    }

    public void killProcess() {
        System.out.println("关闭程序");
    }

    public void closeScreen() {
        System.out.println("关闭屏幕");
    }

    public void powerOff() {
        System.out.println("断电");
    }
}

Person类

public class Person {
    private Computer computer = new Computer();

    public void shutdownComputer() {
        computer.saveData();
        computer.killProcess();
        computer.killProcess();
        computer.powerOff();
    }
}

测试类:

public class Test {
    public static void main(String[] args) {
        Person person = new Person();
        person.shutdownComputer();
    }
}

代码中的问题:Person类对Computer类知道的太多了,计算机关机流程不应该由Person来指定,实际上也不是由Person来指定的,否则可能会因为调用顺序不当造成数据丢失。Computer类中应该只对外提供一个公共的关机方法,至于保存数据、关闭程序、关闭屏幕等方法应该设为私有的并由公共的关机方法来调用,外界不能访问。

遵循迪米特法则的改进方案

Computer类:

public class Computer {
    private void saveData() {
        System.out.println("保存数据");
    }

    private void killProcess() {
        System.out.println("关闭程序");
    }

    private void closeScreen() {
        System.out.println("关闭屏幕");
    }

    private void powerOff() {
        System.out.println("断电");
    }

    public void shutdown() {
        saveData();
        killProcess();
        killProcess();
        powerOff();
    }
}

Person类:

public class Person {
    private Computer computer = new Computer();

    public void shutdownComputer() {
        computer.shutdown();
    }
}

在运用迪米特法则时要注意:

  1. 在类的设计上,应该创建弱耦合的类;考虑是否可以加上final关键字设置成不变类
  2. 在类的结构设计上,尽量降低类成员的访问权限。
  3. 在对其他类的引用上,将对其他对象的引用次数降到最低。
  4. 不暴露类的属性成员,而应该提供相应的get、set方法
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值