设计模式(Java版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.5 迪米特法则

迪米特法则英文名称是Law of Demeter,简称LoD。

2.5.1 迪米特法则的定义

迪米特法则又叫最少知识原则(Least Knowledge Principle,LKP),意思是一个对象应当对其他对象尽可能少的了解。迪米特法则最初是用来作为面向对象的系统设计风格的一种法则,在1987年由Ian Holland在美国东北大学为一个叫迪米特的项目设计提出的,因此叫做迪米特法则。这条法则实际上是很多著名系统,例如火星登陆软件系统、木星的欧罗巴卫星轨道飞船的软件系统的指导设计原则。

迪米特法则不同于其他的OO设计原则,它具有很多种表述方式,其中具有代表性的是以下几种表述:

■ 只与你直接的朋友们通信(Only talk to your immediate friends);

■ 不要跟“陌生人”说话(Don't talk to strangers);

■ 每一个软件单位对其他的单位都只有最少的了解,这些了解仅局限于那些与本单位密切相关的软件单位。

按照迪米特法则,如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用;如果一个类需要调用另一个类的某一个方法,可以通过第三者转发这个调用。例如,“某人”与一个“朋友”组成自己的朋友圈,两个人都需要与一个圈外的“陌生人”发生相互作用,不符合迪米特法则的类图如图2-8所示。

图2-8 不符合迪米特法则的类图

其实,“某人”没有必要与“陌生人”直接发生相互作用,他可以通过“朋友”间接与“陌生人”发生作用,如图2-9所示的类图符合迪米特法则。

图2-9 符合迪米特法则的类图

2.5.2 迪米特法则的应用

下述内容用于实现任务描述2.D.5,演示迪米特法则的应用。如图2-10所示为符合迪米特法则的“某人”、“朋友”和“陌生人”的具体类图。

图2-10 Someone、Friend和Stranger类图

Someone类的源代码如下所示。

【描述2.D.5】 Someone.java

    public class Someone {
        //通过Friend间接调用Stranger类中的方法
        public void call(Friend friend) {
            friend.forward();
        }
    }

Friend类的源代码如下所示。

【描述2.D.5】 Friend.java

    //朋友、中间类
    public class Friend {
        // 声明陌生实例
        private Stranger stranger = new Stranger();
        // 访问
        public void forward() {
            stranger.strangerMethod();
        }
        // 其他方法
        public void friendMethod() {
            System.out.println("这是朋友的方法");
        }
    }

Stranger类的源代码如下所示。

【描述2.D.5】 Stranger.java

    //陌生者
    public class Stranger {
        public void strangerMethod() {
            System.out.println("这是陌生者方法");
        }
    }

下面编写一个测试类进行应用,其代码如下所示。

    public class TestLoD {
        public static void main(String args[]) {
            Someone one = new Someone();
            one.call(new Friend());
        }
    }

运行结果如下所示。

    这是陌生者方法

通过上述代码可以看到,Someone没有与Stranger类直接联系,而是通过Friend类进行间接访问,这样减少了类之间的关系,降低了类之间的耦合。迪米特法则的核心观念就是类之间的解耦、弱耦合,只有弱耦合了以后,类的复用率才可以提高。

在设计模式中,对迪米特法则进行应用的设计模式有如下两个:

■ 外观模式

■ 中介者模式