Класс GuestCast

GuestCast на GitHub

Предназначен для наследования представления посетителя (introduction). Принимает 2 аргумента, если первый посетитель является - гостем ('guest' или функция), то результирующий объект возьмет функциональность второго посетителя и будет тоже гостем. Если первый посетитель является патроном , то результирующий объект возьмет функциональность второго посетителя, но будет так же патроном как и первый посетитель

Это наследование полезно в случаях, когда нужно имея оригинальный посетитель, приходящий в метод, наследовать его представление для уже существующих посетителей, созданных по внутренней логике

Пример 1.

import {
    give,
    Patron,
    SourceWithPool,
    GuestCast,
    removePatronFromPools,
    isPatronInPools,
  } from "patron-oop";

  class NumberOnceATime {
    constructor(number, delay) {
      this.delay = delay;
      this.theNumber = number;
    }

    number(guest) {
      const source = new SourceWithPool(this.theNumber);
      source.value(guest);
      const repeat = () => {
        if (!isPatronInPools(guest)) {
          return;
        }

        setTimeout(() => {
          source.give(this.theNumber);
          repeat();
        }, this.delay);
      };
      repeat();
    }
  }

  class TotalSum {
    constructor(numbers) {
      this.numbers = numbers;
    }

    sum(guest) {
      let totalSum = 0;
      const source = new SourceWithPool(totalSum);
      source.value(guest);
      const numbersGuests = [];
      this.numbers.forEach((numberSource, index) => {
        const numberGuest = new GuestCast(guest, (value) => {
          totalSum += value;
          source.give(totalSum);
        });
        numberSource.number(numberGuest);
        numbersGuests.push(numberGuest);
      });

      return numbersGuests;
    }
  }

  let totalSumGuests = [];
  const renderResult = new Patron((value) => {
    const resultEl = document.querySelector(".guest-cast-result");
    if (resultEl) {
      resultEl.textContent = `Результат = ${value}`;
    } else {
      removePatronFromPools(renderResult);
      totalSumGuests.forEach(removePatronFromPools);
    }
  }, "renderResult");
  totalSumGuests = new TotalSum([
    new NumberOnceATime(1, 1000),
    new NumberOnceATime(10, 5000),
    new NumberOnceATime(100, 10000),
  ]).sum(renderResult);

Результат 1.

Результат = 0
Смотрите также

give Patron