一、原则:
如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。
二、作用:
1.降低了类之间的耦合度,提高了模块的相对独立性
2.由于亲和度降低,从而提高了类的可复用性和系统的扩展性。
3.过渡使用迪米特法则会使系统产生大量的中介类,从而增加系统的复杂性,使模块之间的通信效率降低。所以,在采用迪米特法则时需要反复权衡,确保高内聚和低耦合的同时,保证系统的结构清晰。
三、实现:
1.从依赖者的角度来说,只依赖应该依赖的对象.
2.从被依赖者的角度说,只暴露应该暴露的方法。
四、涉及到的设计模式:
中介者模式,适配器模式
五、示例:
1.平时遇到的需要使用迪米特法则的场景,对外有一套旧接口,对接了很多的厂家,现在系统优化,在全新的项目上开发了功能相同的一系列接口,原有的对外接口不能换掉,只能开发一套转发到新接口的功能:将旧接口的参数转化为新接口的参数发送到新的api接口上,之后将新的api接口返回的数据转换为旧接口的返回结果发送给用户。这个模式是适配器模式。
2.买家和厂家、产品销售
想买一个东西并不需要去生产厂商那里去拿,而是去小卖铺或者超市去购买,小卖铺或者超市就是中介者。
代码示例:
购买者:
@Data
public class Buyers {
private String name;
}
生产厂家:
@Data
public class Manufacturer {
/**
* 产品名称
*/
private String productName;
}
超市:
public class SuperMarket {
private Manufacturer manufacturer;
private Buyers buyers;
public SuperMarket(Manufacturer manufacturer, Buyers buyers) {
this.manufacturer = manufacturer;
this.buyers = buyers;
}
public void sale() {
System.out.println(buyers.getName() + "买了" + manufacturer.getProductName());
}
}
调用代码:
public class MainTest {
public static void main(String[] args) {
Buyers buyers = new Buyers();
buyers.setName("张三");
Manufacturer manufacturer = new Manufacturer();
manufacturer.setProductName("薯片");
SuperMarket superMarket = new SuperMarket(manufacturer, buyers);
superMarket.sale();
}
}
效果: