Образац дизајна је шаблон који решава често понављајући проблем у дизајну софтвера.

Образац посматрача, познат и као образац за објављивање-претплату, је образац понашања. Омогућава вам да обавестите више објеката или претплатника о било ком догађају који је објављен у објекту који посматрају.

Овде ћете научити како да примените образац дизајна посматрача у ТипеСцрипт-у.

Образац посматрача

Образац посматрача функционише тако што дефинише однос један-према-више између објављивача и његових претплатника. Када се догоди догађај у издавачу, он ће обавестити све претплатнике на тај догађај. Један широко распрострањен пример овог обрасца је ЈаваСцрипт слушаоци догађаја.

За контекст, претпоставите да правите уређај за праћење инвентара који прати број производа у вашој продавници. У овом случају, ваша продавница је субјект/издавач, а ваш инвентар је посматрач/претплатник. Коришћење обрасца дизајна посматрача било би оптимално у овој ситуацији.

У обрасцу дизајна посматрача, ваша предметна класа мора да имплементира три методе:

instagram viewer
  • Ан причврстити методом. Овај метод додаје посматрача субјекту.
  • А одвојити методом. Овај метод уклања посматрача са субјекта.
  • А обавести/ажурирај методом. Овај метод обавештава посматраче субјекта када се стање у субјекту промени.

Ваша класа посматрача мора да имплементира један метод, тхе ажурирање методом. Овај метод реагује када дође до промене стања субјекта.

Имплементација предмета и класе посматрача

Први корак у имплементацији овог обрасца је креирање интерфејса за класу субјекта и посматрача, како би се осигурало да имплементирају исправне методе:

// Интерфејс Субјецт/Публисхер
интерфејсПредмет{
аттацхОбсервер (посматрач: Обсервер): празнина;
детацхОбсервер (посматрач: Обсервер): празнина;
нотифиОбсервер(): празнина;
}

// Интерфејс посматрача/претплатника
интерфејсПосматрач{
ажурирање(предмет: Предмет): празнина;
}

Интерфејси у блоку кода изнад дефинишу методе које ваше конкретне класе морају имплементирати.

Конкретна предметна класа

Следећи корак је имплементација конкретне предметне класе која имплементира Предмет интерфејс:

// Субјецт
класаПродавницаимплементираПредмет{}

Затим иницијализујте Предметстање у Продавница класа. Посматрачи субјекта ће реаговати на промене овог стања.

У овом случају, стање је број, а посматрачи ће реаговати на повећање броја:

// Стање субјекта
приватни нумберОфПродуцтс: број;

Затим иницијализујте низ посматрача. Овакав низ је начин на који ћете пратити посматраче:

// иницијализација посматрача
приватни посматрачи: Посматрач[] = [];

Можда ћете пронаћи неке имплементације обрасца посматрача користећи а Подесите структуру података уместо низа за праћење посматрача. Коришћење скупа ће осигурати да се исти посматрач неће појавити двапут. Ако уместо тога желите да користите низ, требало би да проверите да ли има дуплих посматрача у вашем причврстити методом.

Следеће, требало би да примените Предметметоде -причврстити, одвојити, и обавести/ажурирај— у вашем конкретном часу.

За имплементацију причврстити метод, прво проверите да ли је посматрач већ везан и избаците грешку ако јесте. У супротном, додајте посматрача у низ користећи Метод ЈаваСцрипт низа, гурати:

// Прилагање посматрача (с)
аттацхОбсервер (посматрач: Обсервер): празнина {
// Проверите да ли је посматрач већ везан
конст обсерверЕкистс = ово.обсерверс.инцлудес (посматрач);

ако (обсерверЕкистс) {
бацитиНоваГрешка('Обсервер је већ претплаћен');
}

// Додај новог посматрача
ово.посматрачи.пусх(посматрач);
}

Затим примените своје одвојити метод проналажењем индекса и уклањањем из низа помоћу ЈаваСцрипт-а спајање методом.

Могу постојати сценарији у којима је посматрач којег покушавате да одвојите већ одвојен или уопште није био претплаћен. Требало би да се носите са овим сценаријима додавањем условне изјаве да проверите да ли је посматрач у низу или скупу, у зависности од случаја.

// Одвајање посматрача (с)
детацхОбсервер (посматрач: Обсервер): празнина {
конзола.Пријава(`Одвајање посматрача ${ЈСОН.стрингифи (посматрач)}`);
конст обсерверИндек = ово.обсерверс.индекОф (посматрач);

иф (индекс посматрача -1) {
бацитиНоваГрешка('Посматрач не постоји');
}

ово.посматрачи.сплице(обсерверИндек, 1);
цонсоле.лог('Посматрач одвојен...');
}

Затим примените своје обавести/ажурирај метод тако што ћете прећи преко ваше листе посматрача и позвати ажурирање метод сваког од њих:

// Обавештавање посматрача
нотифиОбсервер(): празнина {
цонсоле.лог('Обавештавање посматрача...');

за (конст посматрач офово.посматрачи) {
обсервер.упдате(ово);
}
}

Коначно, за Предмет класе, имплементирати метод који манипулише стањем, а затим обавештава посматраче о промени позивањем њиховог обавести/ажурирај методом. Овај пример је поједностављење начина на који субјект може да изврши радњу, а затим обавести посматраче:

// Промена стања и обавештавање посматрача
новиПроизвод (производи: број): празнина {
ово.нумберОфПродуцтс += производи;
цонсоле.лог('Нови производ је додат у продавницу');
ово.нотифиОбсервер();
}

Конкретни посматрачи

Направите класу или класе посматрача да бисте се претплатили на издавача. Свака класа посматрача мора да имплементира Посматрач интерфејс.

Часови посматрача ће имплементирати а обавести/ажурирај метод који само субјект који посматрају треба да позове. Овај метод треба да садржи сву пословну логику коју треба да покренете као одговор на промену стања субјекта:

// Бетонски посматрач 1
класаИнвентаримплементираПосматрач{
ажурирање(): празнина {
цонсоле.лог('Нови производ је додат у продавницу, ажурирање инвентара...');
// Стварна пословна логика иде овде...
}
}

// Цонцрете Обсервер 2
класаЦустомеримплементираПосматрач{
ажурирање(): празнина {
цонсоле.лог('Нови производ је додат у продавницу, морам да га погледам...');
// Стварна пословна логика иде овде...
}
}

Коришћење обрасца посматрача

Да бисте користили овај образац, инстанцирајте конкретну тему и класе посматрача. Када то урадите, позовите Субјекта причврстити метод и прослеђује инстанцу Обсервер као аргумент. Као одговор, субјект ће додати ту инстанцу на своју листу посматрача:

// Инстанцирање субјекта и посматрача
конст продавница = Нова Сторе();
конст инвентар = Нова Инвентар();
конст купац = Нова купац()

// Претплата објеката на издавача
продавница.аттацхОбсервер(инвентар);
продавница.аттацхОбсервер(купац);
// Промена стања субјекта
продавница.Нови производ(30);

Овај код симулира промену стања. Промена ће покренути метод обавештавања на Предмет класа. Овај метод, заузврат, позива обавестити метод на сваког од својих посматрача. Сваки посматрач ће тада водити сопствену пословну логику.

Овај образац треба да користите само када промене стања једног објекта утичу на друге објекте, а скуп укључених објеката је непознат или динамичан.

Предности коришћења узорка посматрача

Коришћење овог обрасца у вашем коду омогућава вам да одржите принцип отварања/затварања. Можете додати онолико претплатника колико желите и успоставити односе између објеката у току извршавања, без промене кода субјекта.