深入理解接口隔离原则(ISP):代码示例与应用场景

72 阅读2分钟

深入理解接口隔离原则(ISP):代码示例与应用场景

什么是接口隔离原则?

接口隔离原则(Interface Segregation Principle, ISP)是面向对象设计中的五大原则之一,由罗伯特·C·马丁提出。其核心思想是:客户端不应该被迫依赖于它们不使用的接口。换句话说,一个类对另一个类的依赖应该建立在最小的接口上。

为什么需要接口隔离原则?

  1. 减少耦合:避免客户端依赖不需要的接口,降低模块间的耦合度。
  2. 提高灵活性:接口拆分后,修改或扩展功能时影响范围更小。
  3. 增强可读性:小而专的接口更容易理解和维护。

代码示例

违反ISP的设计

public interface Worker {
    void work();
    void eat();
}

public class HumanWorker implements Worker {
    @Override
    public void work() {
        System.out.println("Human is working.");
    }

    @Override
    public void eat() {
        System.out.println("Human is eating.");
    }
}

public class RobotWorker implements Worker {
    @Override
    public void work() {
        System.out.println("Robot is working.");
    }

    @Override
    public void eat() {
        throw new UnsupportedOperationException("Robot cannot eat!");
    }
}

问题:RobotWorker被迫实现了eat()方法,尽管它不需要。

遵循ISP的设计

public interface Workable {
    void work();
}

public interface Eatable {
    void eat();
}

public class HumanWorker implements Workable, Eatable {
    @Override
    public void work() {
        System.out.println("Human is working.");
    }

    @Override
    public void eat() {
        System.out.println("Human is eating.");
    }
}

public class RobotWorker implements Workable {
    @Override
    public void work() {
        System.out.println("Robot is working.");
    }
}

改进:接口拆分为WorkableEatableRobotWorker只需实现Workable

应用场景设计

假设我们有一个电商系统,需要处理订单和用户通知。

初始设计

public interface OrderService {
    void createOrder();
    void notifyUser();
}

问题:如果某个服务只需要创建订单,却被迫实现notifyUser()方法。

优化设计

public interface OrderCreator {
    void createOrder();
}

public interface UserNotifier {
    void notifyUser();
}

public class OrderServiceImpl implements OrderCreator, UserNotifier {
    @Override
    public void createOrder() {
        System.out.println("Order created.");
    }

    @Override
    public void notifyUser() {
        System.out.println("User notified.");
    }
}

public class SimpleOrderService implements OrderCreator {
    @Override
    public void createOrder() {
        System.out.println("Order created without notification.");
    }
}

优化后,SimpleOrderService只需关注订单创建,无需关心通知逻辑。

总结

接口隔离原则通过拆分臃肿的接口,让系统更加灵活和可维护。在实际开发中,合理运用ISP可以显著提升代码质量。