在本讲,我将为大家介绍软件设计原则里面的第五个原则,即迪米特法则。
概述
迪米特法则,又叫最少知识原则。其表示的含义是只和你的直接朋友交谈,不跟"陌生人"说话。
看到这儿的话,很多人会一头雾水,尼玛的,这到底表示什么含义啊?不着急,咱们看下下面这段描述。
如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。
大家看到这儿,可能还不是特别理解,没关系,下面我会举几个现实生活中的例子来向大家解释一下。
看这样一个例子,如果一个人想要租房的话,那么他找的就该是房屋中介了,而不是直接的房主;再来看这样一个例子,明星和粉丝进行见面的话,肯定是由经纪人来进行安排的,是不是啊?
最后,再看一个例子,假设现在有家公司需要一个办公软件,那么这家公司是直接找具体的软件工程师,还是找某家开发软件的公司啊?肯定是软件公司,而软件公司又会有许多软件工程师,所以它会把甲方需要的办公软件交给具体的软件工程师去开发。其实,软件工程师在去开发软件的时候,很多情况下,他是压根就不知道到底是哪个甲方需要这个软件的,因此他是不需要直接去和甲方沟通的。如果要沟通的话,那么可以通过第三方转发进行沟通。也就是说,软件工程师把他在开发中遇到的问题告诉公司,公司再跟甲方进行沟通,这样,就可以降低软件工程师和甲方之间的耦合度了,继而提高模块的相互独立性。
看完以上我举的这三个例子,特别是最后一个例子,大家是不是对迪米特法则有了一个更深入的认识啊!
最后,我得多说一嘴,迪米特法则里面有一个"朋友"这个词,它所表示的含义是指当前对象本身、当前对象的成员对象、当前对象所创建的对象、当前对象的方法参数等,这些对象同当前对象存在关联、聚合或组合关系(当然,这里面还有依赖关系,因为有方法参数这样一个概念),可以直接访问这些对象的方法。
以上就是"朋友"所带来的好处,说得通俗一点,就是我可以直接去访问你里面的方法。
案例
了解了迪米特法则的概念之后,接下来我们来做一个案例,即明星与经纪人的关系实例,通过这个案例,希望能加深大家对迪米特法则的理解。
案例分析
明星由于全身心投入艺术,所以许多日常事务均由经纪人负责处理,如和粉丝的见面会,和媒体公司的业务洽淡等。这里的经纪人是明星的朋友,而粉丝和媒体公司是陌生人,所以适合使用迪米特法则。
通过上面的描述,我们不难设计出如下所示的类图。
从以上类图中可以看到,我们定义了一个明星类,它里面有一个name成员变量,用于表示明星的姓名,而且还有一个有参构造和获取明星姓名的getName方法。至于,另外定义的两个类,即粉丝类和媒体公司类,它俩与明显类比较相似,这里我就不再详细赘述了。
目前,定义好的以上这三个类是没有任何关系的,如果我们要让它们产生关系,那么就得借助于第三方类了,即经纪人类。在该类里面我们会声明以上三个类型的成员变量,并提供对应的setter方法,此外,我们还提供了与粉丝见面和业务洽谈这俩成员方法,而且这俩成员方法的具体描述,我也体现在以上类图中了。
有些同学可能会问,经纪人类和明星类、粉丝类、媒体公司类这三个类有什么关系呢?由于是在经纪人类里面声明了这三个类型的成员变量,所以经纪人类和这三个类就是属于聚合关系了,相信大家对这点是没有任何疑问的。
接下来,我们便来通过代码实现以上明星与经纪人的关系案例。
案例实现
打开咱们的maven工程,然后在com.meimeixia.principles包下创建一个子包,即demo5,我们是在该包下来存放咱们编写的代码的。接下来,我们就要正式开始编写代码来实现以上案例了。
首先,定义一个明星类。
package com.meimeixia.principles.demo5;
public class Star {
private String name;
public Star(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
然后,定义一个粉丝类。
package com.meimeixia.principles.demo5;
public class Fans {
private String name;
public Fans(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
接着,定义一个媒体公司类。
package com.meimeixia.principles.demo5;
public class Company {
private String name;
public Company(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
紧接着,定义一个经纪人类。
package com.meimeixia.principles.demo5;
public class Agent {
private Star star;
private Fans fans;
private Company company;
public void setStar(Star star) {
this.star = star;
}
public void setFans(Fans fans) {
this.fans = fans;
}
public void setCompany(Company company) {
this.company = company;
}
public void meeting() {
System.out.println(star.getName() + "和粉丝" + fans.getName() + "见面");
}
public void business() {
System.out.println(star.getName() + "和" + company.getName() + "洽谈");
}
}
最后,我们来编写一个测试类用作测试,不妨取名为Client。
package com.meimeixia.principles.demo5;
public class Client {
public static void main(String[] args) {
Agent agent = new Agent();
Star star = new Star("林青霞");
agent.setStar(star);
Fans fans = new Fans("张三");
agent.setFans(fans);
Company company = new Company("美美侠媒体公司");
agent.setCompany(company);
agent.meeting();
agent.business();
}
}
以上测试类编写好之后,不妨来运行一下,如下图所示,确实是我们想要的结果哟!
至此,我们就通过以上案例更加深入地认识了一下迪米特法原则,它其实就是为了降低明星类和粉丝类以及媒体公司类之间的一个耦合度。
|