Liigu peamise sisu juurde

Käitumismustritest lähemalt

Sissejuhatus

Eelmistes peatükkides käsitlesime loovmustreid, mis keskenduvad sellele, kuidas objekte luuakse. Sellele järgneb järgmine jada probleeme - mida nende objektidega peale hakata? Täpsemalt siis kuidas need objektid suhtlevad teiste objektidega, milliseid vastutusalasid omavad ning kuidas reageerivad muutustele.

Need küsimused muutuvad aktuaalseks, kui süsteemid kasvavad. Klass, mis alustas ühe selge eesmärgiga, hakkab koguma omavahel mitteseotud loogikat. Objektid põimuvad - ühe muutmine nõuab eelnevalt kolme teise klassi tööpõhimõtte mõistmist. Uue käitumise lisamine tähendab koodi muutmist seal, kus seda ei peaks vaja olema.

Käitumismustrid käsitlevad just selliseid olukordi. Igaüks neist kirjeldab läbiproovitud struktuuri vastutuse jaotamiseks ning objektidevahelise koostöö korraldamiseks.

GoF raamatu käitumismustrid

Gang of Four-i raamat kirjeldab ühteteist käitumismustrit, milleks on:

  • Chain of Responsibility — edastab päringu käsitlejate ahelas edasi, kuniks keegi seda töötleb.
  • Command — kapseldab päringu objektina, võimaldades tagasivõtmist, kordamist ja järjekorda seadmist.
  • Interpreter — määratleb keele grammatika ja selle tõlgendaja.
  • Iterator — võimaldab kollektsiooni elementidele järjestikuliselt ligi pääseda ilma selle struktuuri paljastamata.
  • Mediator — vähendab objektidevahelisi otseseid sõltuvusi, suunates suhtlust keskse vahendaja kaudu.
  • Memento — talletab ja taastab objekti sisemist olekut kapseldust rikkumata.
  • Observer — teavitab automaatselt antud objektist (subjekt) sõltuvate objektide hulka (vaatlejaid), kui subjekti olek muutub.
  • State — võimaldab objektil muuta oma käitumist vastavalt sisemise oleku muutumisele.
  • Strategy — määratleb vahetatavate algoritmide kogumiku ja lubab kontekstil neid käigu pealt vahetada.
  • Template Method — määratleb algoritmi skeleti baasklassis, lastes alamklassidel täita konkreetsed sammud.
  • Visitor — eraldab algoritmi objektidest, millel see toimib, võimaldades uusi operatsioone ilma neid objekte muutmata.

Esialgu käime nendest läbi neli enim kasutusel olevat mustrit: Strategy, Observer, Command ja State. Peatükid teiste mustrite kohta tulevad kunagi hiljem.

Mustrite ühisosad

Erinevalt loovusmustritest, mis tegelevad peamiselt new-võtmesõnaga, käsitlevad käitumismustrid seda, kuidas objektid omavahel suhtlevad.

Sellest tulenevalt ilmnevad pea kõikide mustrite vahel järgmised nähtused:

  • Programmeerimine liideste, mitte teostuste järgi. Iga käitumismuster toob sisse vähemalt ühe liidese (või abstraktse klassi), mis eraldab rolli konkreetsest klassist, mis seda täidab. Kontekst teab ainult liidest - selle taga olevat konkreetset klassi saab vahetada ilma konteksti muutmata.

  • Avatud/suletud printsiip praktikas. Iga muster on üles ehitatud nii, et uusi käitumisi (uusi strateegiaid, vaatlejaid, käske, seisundeid) saab lisada uusi klasse kirjutades, mitte olemasolevaid muutes.

  • Väiksem sidusus koostööd tegevate objektide vahel. Objektid, mis sõltuvad üksteisest kitsaste liideste kaudu, on lihtsamini testitavad, laiendatavad ja mõistetavad kui objektid, mis kasutavad otseselt üksteise teostust.

Need ei ole juhuslikud. Käitumismustrid on sisuliselt erinevad viisid samade aluspõhimõtete rakendamiseks korduvate probleemide lahendamisel.

Märkus mustrite rakendamise kohta

Disainimustrid on tööriistad, mitte eesmärgid, mida saavutada koodis. Eesmärk ei ole leida koht igale mustrile, mida tead, vaid ära tunda, millal sinu ees olev probleem vastab mõnele tuntud lahenduse kujule.

Järgnevad peatükid kirjeldavad iga mustrit konkreetse näite kaudu. Lugedes keskendu lahendatavale probleemile, mitte ainult mehhanismile. Mustri olemasolu põhjuse mõistmine aitab otsustada, kas see sobib sinu enda olukorda.