09. 迪米特法则

作者 : 开心源码 本文共1706个字,预计阅读时间需要5分钟 发布时间: 2022-05-11 共68人阅读

标准定义

迪米特法则(Law of Demeter, LoD)的定义如下:

每个单元只可以和它的朋友交谈:不可以和陌生单元交谈

生活案例

福尔摩斯是有名的侦探,所有的事情通过他的演绎法都原形毕露。在《福尔摩斯探案集》的第一篇《血字的研究》,这是华生和福尔摩斯第一次相遇,华生对他的探案方式匪夷所思,不了解其中的道理,但是到最后,福尔摩斯把案件破解之后,华生才恍然大悟,原来还可以这么玩。由发现疑点到破解案件找出凶手的过程中,福尔摩斯并没有过多地透露自己的破案细节,断案过程,而是保持一个他人看不透的状态。这样的一种侦探方式,一方面可以够让福尔摩斯仔细思考各种线索的联络,找出判案的依据,而不是频繁地被打断,同时打断了思路。另外一个方面也是为了保证探案过程的私密性,防止由于泄露等起因,让逃犯知晓并及时逃走。

神探夏洛克

迪米特法则就是福尔摩斯的探案过程,不可以过多的透露想法。保持神秘感,一方面有利于自己类的管理,另外一个方面,是为了防止别人调使用自己某些类的时候破坏了程序,造成不良的后果。

程序例子

业务还是以打印机的程序来举例子。打印机在打印的时候,会有加墨水,加纸,打印的三个过程,按照(03. 单一功可以准则)[https://www.songma.com/p/5d031e0b33a7]的定义,我们定义了三个接口。

interface IPrinter {  void addInk(IInk ink);  void addPaper(IPaper paper);  void print()}

那假如假设,我们又一次面临打印机的更新,打印机不仅仅可以够通过空气的雾霾来合成墨水了,而且还可以通过灰尘来合成纸张,完全不需要使用户去加墨水,加纸。那假如我们的接口不变,我们会面临什么问题?

我们先写一下打印机的实现。

public class CanonPrinter implements IPrinter {  @Override  public void addInk(IInk ink) {    System.out.println("用"+ink+"进行打印");  }  @Override  public void addPaper(IPaper paper) {    System.out.println("用"+paper+"进行打印");  }  @Override  public void print() {    addInk(new BlackInk());    addPaper(new A4Paper());    System.out.println("用黑色的墨水和A4纸打印文档");  }}

当我们实现调使用的时候,我们会写这样的代码:

public class Main {  public static void main(String[] args) {    IPrinter printer = new CanonPrinter();    printer.addInk(new RedInk());    printer.addPaper(new A3Paper());    printer.print();  }}

当调使用方运行的时候,明明用了红色的墨水和A3纸,但是很不幸的是,打印出来的文档居然是用了黑色墨水和A4纸的打印的,呵,什么破打印机。

那怎样改?

很简单,把addInk和addPaper去掉就好了。

interface IPrinter {  void print()}
public class CanonPrinter implements IPrinter {  private void addInk(IInk ink) {    System.out.println("用"+ink+"进行打印");  }  private void addPaper(IPaper paper) {    System.out.println("用"+paper+"进行打印");  }  @Override  public void print() {    addInk(new BlackInk());    addPaper(new A4Paper());    System.out.println("用黑色的墨水和A4纸打印文档");  }}

那么调使用方就只要要调使用print方法即可以了,哈哈,高科技。

https://www.songma.com/p/f59e3f1b0968

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 09. 迪米特法则

发表回复