低耦合GRASP模式


问题
如何支持低依赖性,低变化影响并增加重用?

解决方案
分配责任以使耦合保持低水平。

关于低耦合的要点

  • “工件”(类,模块,组件)之间的依赖性低。

  • 模块之间不应该有太多的依赖关系,即使有依赖关系,也应该通过接口,并且应该是最小的。

  • 避免两个类之间的紧密耦合(如果一个类想要调用第二个类的逻辑,那么第一个类需要第二个类的对象,这意味着第一个类创建第二个类的对象)。

  • 努力实现交互对象之间的松散耦合设计。

  • 控制反转(IoC)/依赖注入(DI) - DI对象在创建时由某些第三方(即Java EE CDI,Spring DI ...)协调它们在系统中的每个对象的依赖关系。对象不需要创建或获取它们的依赖项,依赖项被注入到需要它们的对象中。松耦合是DI的主要优点。

执行

这是松耦合的一个例子。在这个类中,Traveler类没有与汽车或自行车实现紧密耦合。相反,通过应用依赖注入机制,实现了松耦合,从而允许使用已实现Vehicle  接口的任何类开始旅程。
步骤1:  Vehicle 接口允许松散耦合实现。

interface Vehicle {
    public void move();
}

步骤2:  Car  类实现Vehicle接口。

class Car implements Vehicle {
    @Override
    public void move() {
         System.out.println("Car is moving");
    }
}

步骤3:  Bike  类实现Vehicle接口。

class Bike implements Vehicle {
    @Override
    public void move() {
         System.out.println("Bike is moving");
    }
}

步骤4: 现在创建  Traveler  类,其中包含对Vehicle接口的引用  。

class Traveler {
    private Vehicle v;
    public Vehicle getV() {
         return v;
    }
    public void setV(Vehicle v) {
        this.v = v;
    }

    public void startJourney() {
         v.move();
    }
}

步骤5:松散耦合示例的测试类 - Traveler是松散耦合的示例。

public static void main(String[] args) {
    Traveler traveler = new Traveler();
    traveler.setV(new Car()); // Inject Car dependency
    traveler.startJourney();
// start journey by Car
    traveler.setV(new Bike());
// Inject Bike dependency
    traveler.startJourney();
// Start journey by Bike
}