3.5 迪米特法则(DP)

迪米特法则:Demeter Principle,简称DP

3.5.1 概述

只和你的直接朋友交谈,不跟“陌生人”说话(Talk only to your immediate friends and not to strangers)。

其含义是:如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。(如,学生通过中介租房,而不是直接联系房东)

迪米特法则中的“朋友”是指:当前对象本身、当前对象的成员对象、当前对象所创建的对象(即 在当前对象的方法中创建其他对象)、当前对象的方法参数(即 当前对象方法的形参是一个对象类型,调用改方法需要传入一个实际的对象)等,这些对象同当前对象存在关联、依赖、聚合或组合关系,可以直接访问这些对象的方法。

3.5.2 案例

下面看一个例子来理解迪米特法则

【例】明星与经纪人的关系实例

明星由于全身心投入艺术,所以许多日常事务由经纪人负责处理,如和粉丝的见面会,和媒体公司的业务洽淡等。这里的经纪人是明星的朋友,而粉丝和媒体公司是明星的陌生人,降低了明星和粉丝以及明星和公司的耦合度,所以适合使用迪米特法则。

在这里插入图片描述

public class Fans {
    private String name;

   // 有参构造
    public Fans(String name) {this.name = name;}

    public String getName() {return name;}
}
=========================================================
  public class Star {
    private String name;

    // 带参构造
    public Star(String name) {this.name = name;}

    public String getName() { return name;}
}
==========================================================
  public class Company {
    private String  name;

    // 有参构造
    public Company(String name) {this.name = name;}

    public String getName() {return name;}
}
===========================================================
  // 经纪人类,相当于第三方
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(fans.getName()+"与明星"
                +star.getName()+"见面了");
    }
   public void business(){
        System.out.println(company.getName()+"与明星"
                +star.getName()+"洽谈业务");
    }
}
===================================================
public class ClientTest {
    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();
    }
}

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部