ICO 控制反转

// 1. 自己创建所有依赖
class Water {
  boil() {
    console.log("水烧开了!");
  }
}

class CoffeeBean {
  grind() {
    console.log("咖啡豆磨好了!");
  }
}

// 2. CoffeeMaker 自己管理依赖
class CoffeeMaker {
  constructor() {
    this.water = new Water();  // 自己 new 水
    this.coffeeBean = new CoffeeBean();  // 自己 new 咖啡豆
  }

  makeCoffee() {
    this.water.boil();
    this.coffeeBean.grind();
    console.log("咖啡做好了!☕");
  }
}

// 3. 使用 CoffeeMaker
const maker = new CoffeeMaker();
maker.makeCoffee();

问题:

  • 如果 Water 或 CoffeeBean 变了(比如改用 MineralWater 矿泉水),必须改 CoffeeMaker 的代码!
  • 测试时很难替换依赖(比如用 MockWater 模拟测试)。