Дизајнерске шаре - Брзи водич за образац посматрача.

Узорак посматрача је врло често коришћен образац. У ствари, толико је честа да је стандардизована у многим програмским језицима / библиотекама. У Јави постоји ињава.утил.Обсервер (застарело у Јава 9). У Питхон-у је онолико близу колико апип инсталира проматрач узорака. У Ц ++ понекад можемо користити боост библиотеку, тачније #инцлуде <боост / сигнал2.хпп>. Међутим, широко се користи у индустрији као прилагођено решење. Да бисмо га могли правилно користити и разумети његову сложеност, морамо да уђемо у њега и истражимо га.

Узорак посматрача класификован је међу обрасцима дизајна понашања. Обрасци бихевиоралног дизајна посебно се тичу комуникације између класа / објеката. [по дизајнерским узорцима једноставно објасњено]

Шта је образац посматрача? Осим монитора за ходање који емитира аналогну телевизију (као на слици). Циљ обрасца је да дефинише однос један према многима тако да када један објект промени стање, остали се обавештавају и ажурирају аутоматски. Тачније, жели да буде обавештен о дешавањима у систему. Оставимо комаде слагалице у три корака.

Корак 1 - Кључне речи

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

  1. Предмет: Сматра се чуваром информација, података или пословне логике.
  2. Регистрација / прилог: Посматрачи се региструју на тему јер желе да буду обавештени кад дође до промене.
  3. Догађај: Догађаји делују као окидач за тему тако да су сви посматрачи обавештени.
  4. Обавијести: У зависности од имплементације, субјект може „гурнути“ информације посматрачима, или их посматрачи могу „повући“ ако им требају информације из предмета.
  5. Ажурирање: Посматрачи ажурирају своје стање независно од других посматрача, али њихово се стање може променити у зависности од покренутог догађаја.

Корак 2 - Дијаграм

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

  • ЦонцретеОбсерверс су класе које садрже информације специфичне за тренутну инстанцу. Функција ажурирања се зове операција нотификације () субјекта. Посматрачи се ажурирају независно на основу тренутног стања.
  • Посматрач је матична класа конкретних посматрача. Садржи предметни примерак. Када се посматрач иницијализира, он се региструје / придаје субјекту.
  • Предметна класа садржи листу или збирку посматрача. Када се покрене догађај он позива операцију нотифи () која се проматра кроз све посматраче позивањем њихове функције ажурирања.

Корак 3 - Шифра по примеру

Предлажем да копирате класу кода по класу из мог гит складишта "Андреас Поииас" или исечке доле (редоследом који је приложен) и залепите га у било који од доступних мрежних Ц ++ уредника као што су ц ++ схелл, јдоодле, онлинеГДБ и покрените то посматрати излаз. Затим прочитајте коментаре или опис испод. Одвојите време, пажљиво га прочитајте (то значи једну минуту, не мање, а не више).

Пример: Размотрите фудбалску утакмицу. Многи навијачи гледају утакмицу. Подржавају се навијачи у две категорије по узрасту, младима и старима. Када њихов тим постигне гол, присталице реагују различито у складу са годинама и нивоом узбуђења.
Хајде да разговарамо са терминима који се користе за образац посматрача:

  • Игра је тема, а присталице су посматрачи.
  • Сви посматрачи су приложени / регистровани за предмет и обавештавају се када постигне погодак фудбалског тима (окидач је ако њихов тим постигне гол).
  • Посматрачи ажурирају своје понашање у зависности од примљеног обавештења.

Предмет
За ову класу нам је потребан списак посматрача. Када се посматрачи спремају за регистрацију, они позивају функцију тхеаттацх (ову) да би се додали на листу доступних (ово је посматрачева инстанца). Када се покрене догађај, освестите () све посматраче да самостално ажурирају своје стање. У овом примеру, окидач је ако је посматрачки фудбалски тим постигао гол.

#инцлуде <иостреам>
#инцлуде <вецтор>
користећи намеспаце стд;
Предмет класе {
    вектор <посматрач класе *> посматрачи;
    боол забио; // окидач, догађај
јавно:
    // региструјте посматраче
    неважећи прилог (Обсервер * обс) {
        обсерверс.пусх_бацк (обс);
    }
   
   // Ово је ДОГАЂАЈ
   // подесите иф иф и обавестите СВЕ посматраче
   воид сетСцоред (боол оцена) {
      сцоре = скор;
      нотифи ();
   }
боол гетСцоред () {
      повратни резултат;
   }
   // имплементација нотификација је даље смањена
   // тако да се скрипта компајлира и покрене
   воид нотифи ();
};

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

класа Посматрач
{
    Субјецт * субј;
    инт екцитементЛевел; // држава
  јавно:
    Посматрач (Субјецт * мод, инт екцЛевел)
    {
        субј = мод;
        екцитементЛевел = екцЛевел;
        // Посматрачи се региструју / придруже субјекту
        субј-> аттацх (тхис);
    }
    виртуал воид упдате () = 0;
  заштићено:
    Тема * гетСубјецт () {
       ретурн субј;
    }
    воид сетЕкцитементЛевел (инт екцЛевел) {
       екцитементЛевел = екцЛевел;
    }
    инт гетЕкцитементЛевел () {
       повратак узбуђењеЛевел;
    }
};

Ово је декларацијаСубјецт :: нотифи () и као што смо споменули пре њеног посла је да обавести све проматраче да ажурирају своје стање.

неважећа тема :: нотифи () {
  фор (инт и = 0; и <обсерверс.сизе (); и ++)
    посматрачи [и] -> упдате ();
}

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

класа Олд_ЦонцретеОбсервер: јавни посматрач
{
   јавно:
     // Позива родитељски конструктор да се региструје за предмет
     Олд_ЦонцретеОбсервер (Субјецт * мод, инт див)
        : Обсервер (мод, див) {}
     // За старије људе, ако је ниво узбуђења
     // има преко 150, они ризикују срчани удар
     неважеће ажурирање ()
     {
        боол сцоре = гетСубјецт () -> гетСцоред ();
        сетЕкцитементЛевел (гетЕкцитементЛевел () + 1);
        иф (постигао && гетЕкцитементЛевел ()> 150)
        {
          цоут << "Тим старог посматрача постигао је гол!"
               << "Ниво узбуђења му је"
               << гетЕкцитементЛевел ()
               << "пазите на срчане ударе!" << ендл;
        } елсе {
          цоут << "Тим није постигао гол. Иеееих не треба бринути"
               << ендл;
        }
    } // крај ажурирања ()
};
класа Иоунг_ЦонцретеОбсервер: јавни посматрач
{
   јавно:
     // Позива родитељски конструктор да се регистрира за предмет
     Иоунг_ЦонцретеОбсервер (Субјецт * мод, инт див)
       : Обсервер (мод, див) {}
     // За старије људе, ако је ниво узбуђења
     // има преко 100, они ризикују срчани удар
     неважеће ажурирање ()
     {
        боол сцоре = гетСубјецт () -> гетСцоред ();
        сетЕкцитементЛевел (гетЕкцитементЛевел () + 1);
        иф (постигао && гетЕкцитементЛевел ()> 100)
        {
          цоут << "Тим младог посматрача постигао је гол!"
               << "Ниво узбуђења му је"
               << гетЕкцитементЛевел ()
               << "не пије и не вози !!" << ендл;
        } елсе {
          цоут << "Тим није постигао гол.
               << ендл;
       }
    } // крај ажурирања ()
};

Основна функција
Конкретни посматрачи региструју се у предмету Субјекта. Њихово стање је ниво узбуђења који је други параметар. Када се активира догађај „субј.сетСцоред (труе)“, тада се позиваСубјецт :: нотифи () да ажурира регистроване посматраче. У доњем сценарију имамо три посматрача, млади Обс1 је прекомерно узбуђен и рискира да пије и вози, стари Обс1 је такође преувеличан, што представља другачији ризик (срчани удар). Коначно, млади Обс2 који је такође млад као и први нема о чему да се брине јер није преувеличан.

Важно је приметити да су се три посматрача ажурирала независно на основу свог стања (ниво узбуђења) и врсте (млади или стари).
инт маин () {
   Субјецт субј;
   Иоунг_ЦонцретеОбсервер иоунгОбс1 (& субј, 100);
   Олд_ЦонцретеОбсервер олдОбс1 (& субј, 150);
   Иоунг_ЦонцретеОбсервер иоунгОбс2 (& субј, 52);
   субј.сетСцоред (труе);
}
// Оутпут
// Екипа младог посматрача постигла је гол !! Ниво узбуђења му је 101
// не пијем и не возим !!
// Екипа старог посматрача постигла је гол !! Његова узбуђеност је 151 сат
// ван срчаних удара! Тим није постигао гол.
// Не морате бринути

Неколико је предности употребе Обсервер обрасца и неколико тачака које треба напоменути када се овом обрасцу треба приступити [Леарнинг Питхон Десигн Паттернс].

  • Узорак посматрача пружа дизајн где су Субјект и Посматрач лагано повезани. Предмет не треба знати о класи ЦонцретеОбсервер. Сваки нови посматрач може бити додан у било ком тренутку. Нема потребе да мењате Субјецт када се дода нови Посматрач. Посматрачи и субјекти нису повезани и независно су једни од других, стога промене у Предмету или Посматрачу неће утицати једни на друге.
  • Не постоји опција за састав, јер се Обсервер-ов интерфејс може проценити тренутно.
  • Ако се Посматрач злоупотребљава, он лако може додати сложеност и довести до проблема са перформансама.
  • Обавештења могу бити непоуздана и могу резултирати условима трке или недоследношћу.

Следећи блог ће бити брзи водич за модел дизајна моста. То је структурални образац дизајна који се доста користи у индустрији. Не заборавите да волите / пљескате мој блог пост и пратите мој налог. Ово ће ми пружити задовољство што сам помагао неким колегама програмерима и натерао ме да наставим са писањем. Ако постоји одређени образац дизајна о којем бисте желели да сазнате, јавите ми како бих вам га могао пружити у будућности.

Остали брзи водичи о дизајнерским обрасцима:

  1. Дизајнерске шаре - Брзи водич за Савезну фабрику.
  2. Дизајнерске шаре - Брзи водич за Бридге Паттерн.
  3. Дизајнерске шаре - Брзи водич за Буилдер Паттерн.
  4. Дизајнерске шаре - Брзи водич за Декоративни узорак.
  5. Дизајнерске шаре - Брзи водич за фасадни узорак.
  6. Обрасци дизајна - брзи водич за образац посматрача.
  7. Дизајнерске шаре - Брзи водич за Синглетон паттерн.