5. 迪米特法则

五、迪米特法则

1. 概念

迪米特法则又叫最少知识原则。

  • 只和你直接朋友说话,不和陌生人讲话

什么意思?没理解,感觉很虚,那么我继续解释一下:

  • 如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。
  • 这样做的好处就是降低类之间的耦合度,提高模块的相对独立性。

【举个例子】

假如现在我要买房,我去卖房软件上,看到了一个自己喜欢的房,打电话,接电话的人大多都是房产中介。

再比如,我们都是程序员,如果有一家公司想做一款app,他会去找软件工程师呢,还是软件开发公司,他一定回去找开发公司。我们开发工程师根本不需要知道甲方是谁,我们只负责开发即可,这就是软件实体之间无需直接通信。

迪米特法则中的 “ 朋友 ” 的概念:

  • 当前对象本身(自己和自己肯定是朋友)
  • 当前对象的成员对象
  • 当前对象所创建的对象(再当前对象中创建了另一个对象)
  • 当前对象的方法参数

存在关联,聚合,组合,依赖关系的都可以直接访问这些对象的方法,不需要中间商。

知识点拓展-关联关系在这里插入图片描述

【知识点解谜】

依赖与聚合傻傻分不清楚:现在你可以简单的理解为一个是成员对象,一个是局部变量。

在这里插入图片描述

【案例-明星与经纪人】

明星由于全身心投入艺术,还需要唱跳打篮球,所以许多日常事务由经纪人负责处理,如和粉丝的见面会,和媒体公司的业务治淡等。这里的经纪人是明星的朋友,而粉丝和媒体公司是陌生人,所以适合使用迪米特法则。

不使用迪米特法则的代码:

/**
 * 粉丝类
 */
@Getter
@AllArgsConstructor
public class Fans {
    private String name;
}

/**
 * 媒体公司
 */
@Getter
@AllArgsConstructor
public class Company {
    private String name;
}

/**
 * 明星类
 */
@Getter
@AllArgsConstructor
public class Star {
    private String name;

    /**
     * 和某个粉丝见面
     */
    public void meeting(Fans fans) {
        System.out.println("明星" + name + "和粉丝" + fans.getName() + "见面了!!!");
    }

    public void business(Company company) {
        System.out.println("明星" + name + "和公司" + company.getName() + "洽谈工作!!!");
    }


}

/**
 * 测试类
 */
public class Test {
    public static void main(String[] args) {
        Company company = new Company("企鹅公司");
        Star star = new Star("蔡老师");
        Fans fans = new Fans("小明");
        star.meeting(fans);
        star.business(company);
    }
}

使用迪米特原则修改代码:

/**
 * 明星类
 */
@Getter
@AllArgsConstructor
public class Star {
    private String name;
}

/**
 * 粉丝类
 */
@Getter
@AllArgsConstructor
public class Fans {
    private String name;
}

/**
 * 媒体公司
 */
@Getter
@AllArgsConstructor
public class Company {
    private String name;
}

@Getter
@AllArgsConstructor
public class Agent {
    private Star star;
    private Fans fans;
    private Company company;

    /**
     * 和某个粉丝见面
     */
    public void meeting() {
        System.out.println("明星" + star.getName() + "和粉丝" + fans.getName() + "见面了!!!");
    }

    public void business() {
        System.out.println("明星" + star.getName() + "和公司" + company.getName() + "洽谈工作!!!");
    }
}

/**
 * 测试类
 */
public class Test {
    public static void main(String[] args) {
        Agent agent = new Agent(new Star("苍井老师"), new Fans("李四"), new Company("某大型娱乐公司"));
        agent.meeting();
        agent.business();
    }
}

使用迪米特原则设计后的Star就和Fans,Company解耦了,提高了扩展性。

记住:不要和陌生人说话,想说话,找我经纪人。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值