Java设计模式-软件设计原则-迪米特法则

岳庆锦

发布于 2022.03.09 23:24 阅读 3303 评论 0

迪米特法则(最少知识原则)

 定义:只和你的直接朋友交谈,不跟“陌生人”说话。

 其含义是:如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。

 软件实体包括以下几个部分:①项目中划分出的模块②类与接口③方法

 举个栗子,我们租房子要找房屋中介,而不是直接找房主。租房者只需把购房需求告诉房屋中介就好,根本不需要知道具体的房主是谁;同理,房主也只需把房子的条件告诉中介者就好,根本不需要知道买房子的人是谁,而房屋中介就负责在两者之间传达消息,帮助完成交易。

 目的:降低类之间的耦合度,提高模块的相对独立性。(上例中就是降低了租房者和房主之间的耦合度,提高了这两个模块的相对独立性)

 迪米特法则中的“朋友”是指:

 ①当前对象本身。

 ②当前对象的成员对象。(成员变量传进来的一个成员对象)

 ③当前对象所创建的对象。(在当前对象的方法中所创建的其它类的对象)

 ④当前对象的方法参数。(调用当前对象的方法时当做形参传递进来的一个具体的对象)

 这些对象同当前对象存在关联、聚合或组合关系(其实还有依赖关系,因为有方法参数的概念),可以直接访问这些对象的方法(朋友的好处)

 应用:下面我们通过“明星与经纪人”的例子来理解“迪米特法则”。

 分析:明星由于全身心投入艺术,所以许多日常事务由经纪人负责处理,如果和粉丝的见面会,和媒体公司的业务洽谈等。这里的经纪人就是明星的“朋友”,而粉丝和媒体公司就是“陌生人”。

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.运行结果

以上就通过“迪米特法则”实现了“明星和经纪人”的案例,迪米特法则主要是降低类之间的耦合度,提高模块的相对独立性(案例中就降低了明星类和粉丝类、媒体公司类之间的耦合度)。但是,过度使用迪米特法则会使系统产生大量的中介类(案例中的经纪人类),从而增加系统的复杂度。所以,在采用迪米特法则时要反复权衡,确保高内聚和低耦合的同时,保证系统的结构清晰。