定义:高层模块不应该依赖于低层模块的具体实现,而应该依赖于抽象

核心思想:**要面向接口编程,不要面向实现编程

类比:使用一个通用的插座(抽象)来连接不同的电器(具体实现),而不是为每个电器设计特定的插座

应用场景

  • 需要减少模块之间的耦合
  • 想提高系统的可扩展性和灵活性

优点

  • 提高系统的灵活性和可扩展性
  • 降低模块之间的耦合度

示例:用户管理器(UserManager)依赖于抽象接口 ILogger,而不依赖于具体的日志记录器实现类

  interface ILogger {
    log(message: string): void;
  }
  
  class ConsoleLogger implements ILogger {
    public log(message: string): void {
    console.log(`[ConsoleLogger] ${message}`);
 }
  }
  
  class FileManagerLogger implements ILogger {
    public log(message: string): void {
      // Log message to file
      console.log(`[FileManagerLogger] ${message}`);
    }
  }
  
  class UserManager {
    private logger: ILogger;
  
    constructor(logger: ILogger) {
      this.logger = logger;
    }
  
    public addUser(name: string): void {
      // Add user logic
      this.logger.log(`User added: ${name}`);
    }
  }
  
  // Usage
  const consoleLogger = new ConsoleLogger();
  const fileManagerLogger = new FileManagerLogger();
  
  const userManager1 = new UserManager(consoleLogger);
  userManager1.addUser('John');
  
  const userManager2 = new UserManager(fileManagerLogger);
  userManager2.addUser('Jane');