定义:只和你的直接朋友交谈,不跟“陌生人”说话。
其含义是:如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。
软件实体包括以下几个部分:①项目中划分出的模块②类与接口③方法
举个栗子,我们租房子要找房屋中介,而不是直接找房主。租房者只需把购房需求告诉房屋中介就好,根本不需要知道具体的房主是谁;同理,房主也只需把房子的条件告诉中介者就好,根本不需要知道买房子的人是谁,而房屋中介就负责在两者之间传达消息,帮助完成交易。
目的:降低类之间的耦合度,提高模块的相对独立性。(上例中就是降低了租房者和房主之间的耦合度,提高了这两个模块的相对独立性)
迪米特法则中的“朋友”是指:
①当前对象本身。
②当前对象的成员对象。(成员变量传进来的一个成员对象)
③当前对象所创建的对象。(在当前对象的方法中所创建的其它类的对象)
④当前对象的方法参数。(调用当前对象的方法时当做形参传递进来的一个具体的对象)
这些对象同当前对象存在关联、聚合或组合关系(其实还有依赖关系,因为有方法参数的概念),可以直接访问这些对象的方法(朋友的好处)。
应用:下面我们通过“明星与经纪人”的例子来理解“迪米特法则”。
分析:明星由于全身心投入艺术,所以许多日常事务由经纪人负责处理,如果和粉丝的见面会,和媒体公司的业务洽谈等。这里的经纪人就是明星的“朋友”,而粉丝和媒体公司就是“陌生人”。
1.明星类(Star)
public class Star {
//明星姓名
private String name;
//有参构造
public Star(String name) {
this.name = name;
}
//获取明星姓名的get方法
public String getName() {
return name;
}
}
2.粉丝类(Fans)
public class Fans {
//粉丝姓名
private String name;
//有参构造
public Fans(String name) {
this.name = name;
}
//get方法,获取粉丝的姓名
public String getName() {
return name;
}
}
3.媒体公司类(Company)
public class Company {
//媒体公司的公司名
private String name;
//有参构造方法
public Company(String name) {
this.name = name;
}
//获取公司名
public String getName() {
return name;
}
}
代码写到这,此时,这三个类还没有任何关系,要产生关系就要借助第3方类(经纪人类,Agent)
4.经纪人类(Agent),聚合了明星类、粉丝类和媒体公司类的对象,包含各自的set方法,粉丝见面的方法和业务洽谈的方法。
public class Agent {
//聚合
private Star star;
private Fans fans;
private Company company;
//对应的set方法
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 buniss(){
System.out.println(star.getName()+"和"+company.getName()+"洽谈");
}
}
5.测试类
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.buniss();
}
}
6.运行结果
以上就通过“迪米特法则”实现了“明星和经纪人”的案例,迪米特法则主要是降低类之间的耦合度,提高模块的相对独立性(案例中就降低了明星类和粉丝类、媒体公司类之间的耦合度)。但是,过度使用迪米特法则会使系统产生大量的中介类(案例中的经纪人类),从而增加系统的复杂度。所以,在采用迪米特法则时要反复权衡,确保高内聚和低耦合的同时,保证系统的结构清晰。
{{ cmt.username }}
{{ cmt.content }}
{{ cmt.commentDate | formatDate('YYYY.MM.DD hh:mm') }}