Предназначен для наследования посетителя (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.