【迪米特法则:解耦的艺术】

221 阅读2分钟

迪米特法则:解耦的艺术与科学

迪米特法则(Law of Demeter),也称为最少知识原则(Principle of Least Knowledge),是一种软件设计原则,旨在减少类之间的耦合度,提高系统的可维护性和可扩展性。本文将通过代码示例深入探讨迪米特法则的应用。

迪米特法则的核心思想

迪米特法则的核心在于一个对象应该只与它的直接朋友通信,不应该知道太多关于其他对象的内部细节。这里的“朋友”指的是以下几类对象:

  1. 当前对象本身。
  2. 以参数形式传入的对象。
  3. 当前对象创建的对象。
  4. 与当前对象一起创建的对象。

代码示例分析

示例1:气象站与温度计
public class Station {
    public Thermometer getThermometer() {
        return new Thermometer();
    }
}

public class Thermometer {
    public double getTemperature() {
        return 10;
    }
}

public class Client {
    public static void main(String[] args) {
        Station station = new Station();
        Thermometer thermometer = station.getThermometer();
        System.out.println(thermometer.getTemperature());
    }
}

在这个示例中,Client 类直接与 StationThermometer 类交互,违反了迪米特法则。Client 应该只与 Station 交互,而 Station 负责获取温度。

示例2:改进的气象站与温度计
public class Station {
    public double getTemperature() {
        Thermometer thermometer = new Thermometer();
        return thermometer.getTemperature();
    }
}

public class Thermometer {
    public double getTemperature() {
        return 10;
    }
}

public class Client {
    public static void main(String[] args) {
        Station station = new Station();
        System.out.println(station.getTemperature());
    }
}

在这个改进的示例中,Client 只与 Station 交互,Station 负责获取温度计的温度,符合迪米特法则。

示例3:明星与经纪人
class Agent {
    private Star myStar;
    private Fans myFans;
    private Company myCompany;

    public void setStar(Star myStar) {
        this.myStar = myStar;
    }

    public void setFans(Fans myFans) {
        this.myFans = myFans;
    }

    public void setCompany(Company myCompany) {
        this.myCompany = myCompany;
    }

    public void meeting() {
        System.out.println(myFans.getName() + "与明星" + myStar.getName() + "见面了。");
    }

    public void business() {
        System.out.println(myCompany.getName() + "与明星" + myStar.getName() + "洽淡业务。");
    }
}

class Star {
    private String name;

    Star(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

class Fans {
    private String name;

    Fans(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

class Company {
    private String name;

    Company(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

public class LoDtest {
    public static void main(String[] args) {
        Agent agent = new Agent();
        agent.setStar(new Star("周杰伦"));
        agent.setFans(new Fans("粉丝娇妹儿"));
        agent.setCompany(new Company("中国传媒有限公司"));
        agent.meeting();
        agent.business();
    }
}

在这个示例中,Agent 类作为中介,处理明星与粉丝和公司的交互,符合迪米特法则。

结论

迪米特法则是一种重要的设计原则,它指导我们如何设计模块间的交互,以减少耦合度,提升系统的可维护性和可扩展性。通过遵循这一原则,我们可以构建出更加灵活、易于管理的软件系统。