一、原则:
如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。
二、作用:
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();
- }
- }
效果: