Programmēšana

Novērotājs un novērojams

Lūk, problēma: jūs izstrādājat programmu, kas atveidos datus, kas apraksta trīsdimensiju ainu divās dimensijās. Programmai jābūt modulārai, un tai ir jāļauj vienlaikus un tajā pašā skatā vienlaikus skatīties vairākus. Katram skatam jāspēj parādīt ainu no cita skatu punkta dažādos apgaismojuma apstākļos. Vēl svarīgāk ir tas, ka, ja mainās kāda no galvenās ainas daļām, skatiem ir jāatjauninās pašiem.

Neviena no šīm prasībām nerada nepārvaramu programmēšanas izaicinājumu. Ja bija jāraksta kods, kas apstrādā katru prasību de novotomēr tas kopējiem centieniem pievienotu ievērojamu darbu. Par laimi atbalstu šiem uzdevumiem jau nodrošina Java klases bibliotēka saskarnes veidā Novērotājs un klase Novērojams- abus daļēji iedvesmoja MVC arhitektūras prasības.

Modeļa / skata / kontroliera (MVC) arhitektūra

Model / View / Controller arhitektūra tika ieviesta kā daļa no Smalltalk, populāras objektorientētas programmēšanas valodas, kuru izgudroja Alans Kejs. MVC tika izstrādāts, lai samazinātu programmēšanas piepūli, kas nepieciešama sistēmu izveidošanai, izmantojot vairākas, sinhronizētas to pašu datu prezentācijas. Tās galvenās iezīmes ir tādas, ka modelis, kontrolieri un skati tiek uzskatīti par atsevišķām entītijām un ka modelī veiktās izmaiņas automātiski jāatspoguļo katrā skatā.

Papildus iepriekšējā piemērā aprakstītajam programmas piemēram Model / View / Controller arhitektūru var izmantot šādos projektos:

  • Diagrammas pakete, kas satur vienus un tos pašus datus joslu diagrammas, līniju diagrammas un sektoru diagrammas skatus.
  • CAD sistēma, kurā dizaina daļas var apskatīt dažādos palielinājumos, dažādos logos un dažādos mērogos.

1. attēlā ir parādīta MVC arhitektūra tās vispārīgākajā formā. Ir viens modelis. Vairāki kontrolieri manipulē ar modeli; vairāki skati parāda datus modelī un mainās, mainoties modeļa stāvoklim.

1. attēls. Modeļa / skata / kontroliera arhitektūra

MVC priekšrocības

Model / View / Controller arhitektūrai ir vairākas priekšrocības:

  • Starp programmas komponentiem ir skaidri noteikta atšķirība - problēmas katrā jomā var atrisināt neatkarīgi.
  • Ir skaidri definēta API - jebkas, kas pareizi izmanto API, var aizstāt modeli, skatu vai kontrolleri.
  • Saikne starp modeli un skatu ir dinamiska - tā notiek darbības laikā, nevis kompilēšanas laikā.

Iekļaujot MVC arhitektūru dizainā, programmas gabalus var noformēt atsevišķi (un veidot tā, lai labi paveiktu savu darbu) un pēc tam sasaistīt izpildes laikā. Ja kādu sastāvdaļu vēlāk uzskata par nederīgu, to var nomainīt, neietekmējot pārējās detaļas. Salīdziniet šo scenāriju ar monolītu pieeju, kas raksturīga daudzām ātri un netīri Java programmām. Bieži vien rāmis satur visu stāvokli, apstrādā visus notikumus, veic visus aprēķinus un parāda rezultātu. Tādējādi visās šādās sistēmās, izņemot visvienkāršāko, izmaiņu veikšana pēc fakta nav niecīga.

Daļu noteikšana

Modelis ir objekts, kas attēlo datus programmā. Tas pārvalda datus un veic visus šo datu pārveidojumus. Modelim nav īpašu zināšanu ne par tā kontrolieriem, ne par viedokli - tajā nav iekšēju atsauču ne uz vienu, ne otru. Drīzāk pati sistēma uzņemas atbildību saglabāt saikni starp modeli un tā uzskatiem un paziņot viedokļus, kad modelis mainās.

Skats ir objekts, kas pārvalda modeļa attēloto datu vizuālo attēlojumu. Tas rada modeļa objekta vizuālo attēlojumu un parāda datus lietotājam. Tas mijiedarbojas ar modeli, izmantojot atsauci uz pašu modeļa objektu.

Kontrolieris ir objekts, kas nodrošina līdzekļus lietotāja mijiedarbībai ar modeļa attēlotajiem datiem. Tas nodrošina līdzekļus, ar kuriem tiek veiktas izmaiņas modeļa informācijā vai skata izskatā. Tas mijiedarbojas ar modeli, izmantojot atsauci uz pašu modeļa objektu.

Šajā brīdī varētu būt noderīgs konkrēts piemērs. Apskatīsim kā piemēru ievadā aprakstīto sistēmu.

2. attēls. Trīsdimensiju vizualizācijas sistēma

Sistēmas centrālais gabals ir trīsdimensiju ainas modelis. Modelis ir virsotņu un seju, kas veido ainu, matemātisks apraksts. Datus, kas raksturo katru virsotni vai seju, var modificēt (iespējams, lietotāja ievadītas informācijas vai ainas sagrozīšanas vai morfēšanas algoritma rezultātā). Tomēr nav jēdziena par skatu punktu, attēlošanas metodi (stiepļu rāmi vai cietu), perspektīvu vai gaismas avotu. Modelis ir tīrs elementu attēlojums, kas veido ainu.

Programmas daļa, kas modeļa datus pārveido grafiskā displejā, ir skats. Skats iemieso faktisko ainas attēlojumu. Tas ir ainas grafiskais attēlojums no konkrēta skatu punkta, īpašos apgaismojuma apstākļos.

Kontrolieris zina, ko var izdarīt ar modeli, un ievieš lietotāja saskarni, kas ļauj sākt šo darbību. Šajā piemērā datu ievades vadības panelis var ļaut lietotājam pievienot, modificēt vai dzēst virsotnes un sejas.

Novērotājs un novērojams

Java valoda atbalsta MVC arhitektūru ar divām klasēm:

  • Novērotājs: Jebkurš objekts, kas vēlas saņemt paziņojumu, mainoties cita objekta stāvoklim.
  • Novērojams: Jebkurš objekts, kura stāvoklis var interesēt un kurš cits objekts var reģistrēt interesi.

Šīs divas klases var izmantot, lai ieviestu daudz vairāk nekā tikai MVC arhitektūru. Tie ir piemēroti jebkurai sistēmai, kurā objektiem automātiski jāinformē par izmaiņām, kas notiek citos objektos.

Parasti modelis ir Novērojams un skats ir Novērotājs. Šīs divas klases apstrādā MVC automātiskās paziņošanas funkciju. Tie nodrošina mehānismu, ar kura palīdzību skatus var automātiski informēt par izmaiņām modelī. Objekta atsauces uz modeli gan kontrolierī, gan skatā ļauj piekļūt modeļa datiem.

Novērotāja un novērojamās funkcijas

Tālāk ir sniegti novērotāju kodu saraksti un novērojamās funkcijas:

Novērotājs

  • public void update (Novērojams obs, Object obj)

    Zvanīts, kad novērojamā stāvoklī ir notikušas izmaiņas.

Novērojams

  • public void addObserver (Observer obs)

    Novērotāju pievieno iekšējam novērotāju sarakstam.

  • public void deleteObserver (Observer obs)

    Izdzēš novērotāju no iekšējā novērotāju saraksta.

  • public void deleteObservers ()

    Dzēš visus novērotājus no iekšējā novērotāju saraksta.

  • public int countobservers ()

    Atgriež novērotāju skaitu iekšējā novērotāju sarakstā.

  • aizsargāts tukšums mainīts ()

    Iestata iekšējo karodziņu, kas norāda, ka novērojamais stāvoklis ir mainīts.

  • aizsargāts tukšums clearChanged ()

    Notīra iekšējo karogu, kas norāda, ka novērojamais stāvoklis ir mainījies.

  • publiskā būla vērtība ir mainījusies ()

    Atgriež Būla vērtību true, ja šis novērojamais ir mainījis stāvokli.

  • publiski anulēts paziņojums Novērotāji ()

    Pārbauda iekšējo karogu, lai redzētu, vai novērojamais ir mainījis stāvokli, un paziņo par to visiem novērotājiem.

  • public anulēt paziņojumu Novērotāji (Object obj)

    Pārbauda iekšējo karogu, lai redzētu, vai novērojamais ir mainījis stāvokli, un paziņo par to visiem novērotājiem. Parametru sarakstā norādīto objektu nodod paziņot() novērotāja metode.

Tālāk mēs apskatīsim, kā izveidot jaunu Novērojams un Novērotājs klasē, un kā sasiet abus kopā.

Paplašiniet novērojamo

Paplašinot klasi, tiek izveidota jauna novērojamo objektu klase Novērojams. Jo klase Novērojams jau ievieš visas vajadzīgās uzvedības nodrošināšanai nepieciešamās metodes, atvasinātajai klasei ir jānodrošina tikai zināms mehānisms novērojamā objekta iekšējā stāvokļa pielāgošanai un piekļuvei.

Iekš ObservableValue zemāk norādot, modeļa iekšējo stāvokli uztver vesels skaitlis n. Šai vērtībai var piekļūt (un, vēl svarīgāk, modificēt) tikai ar publisko piekļuvju starpniecību. Ja vērtība tiek mainīta, novērojamais objekts izsauc savu setChanged () metode, kas norāda, ka modeļa stāvoklis ir mainījies. Pēc tam tā atsaucas uz savējiem paziņot novērotājus () metodi, lai atjauninātu visus reģistrētos novērotājus.

Saraksts 1. ObservableValue

 importēt java.util.Novērojams; publiskā klase ObservableValue pagarina novērojamo {private int n = 0; public ObservableValue (int n) {this.n = n; } public void setValue (int n) {this.n = n; setChanged (); paziņot Novērotāji (); } public int getValue () {return n; }} 

Ieviesiet novērotāju

Jauna objektu klase, kas novēro cita objekta stāvokļa izmaiņas, tiek izveidota, ieviešot Novērotājs interfeiss. The Novērotājs interfeiss prasa, lai Atjaunināt() metode jānodrošina jaunajā klasē. The Atjaunināt() metode tiek izsaukta ikreiz, kad novērojamās izmaiņas ir stāvoklī, un paziņo par šo faktu, izsaucot to paziņot novērotājus () metodi. Pēc tam novērotājam jājautā novērojamais objekts, lai noteiktu tā jauno stāvokli, un MVC arhitektūras gadījumā atbilstoši jāpielāgo skats.

Turpmāk TextObserver sarakstā paziņot() metode vispirms pārbauda, ​​vai novērojamais, kas paziņojis par atjauninājumu, ir novērojams, ko novērotājs novēro. Ja tā ir, tā nolasa novērojamā stāvokļa stāvokli un izdrukā jauno vērtību.

Saraksts 2. TextObserver

 importēt java.util.Observer; importēt java.util.Novērojams; publiskā klase TextObserver īsteno Observer {private ObservableValue ov = null; public TextObserver (ObservableValue ov) {this.ov = ov; } public void update (Novērojams obs, Object obj) {if (obs == ov) {System.out.println (ov.getValue ()); }}} 

Sasieniet abus kopā

Programma paziņo novērojamam objektam, ka novērotājs vēlas, lai viņam paziņo par izmaiņām stāvoklī, piezvanot uz novērojamā objekta addObserver () metodi. The addObserver () metode pievieno novērotāju iekšējam novērotāju sarakstam, par kuru jāinformē, ja novērojamo stāvoklis mainās.

Tālāk sniegtajā piemērā, kurā parādīta klase Main, parādīts, kā lietot addObserver () metode, lai pievienotu TextObserver klase (2. saraksts) novērojamajam sarakstam, ko uztur ObservableValue klase (1. saraksts).

Saraksts 3. addObserver ()

 publiskā klase Main {public Main () {ObservableValue ov = new ObservableValue (0); TextObserver to = jauns TextObserver (ov); ov.addObserver (uz); } public static void main (String [] args) {Main m = new Main (); }} 

Kā tas viss darbojas kopā

Turpmākā notikumu secība apraksta to, kā parasti novērojama un novērojama mijiedarbība notiek programmā.

  1. Vispirms lietotājs manipulē ar lietotāja saskarnes komponentu, kas pārstāv kontrolieri. Kontrolieris veic izmaiņas modelī, izmantojot publiskā piekļuves metodi - kas ir setValue () iepriekš minētajā piemērā.
  2. Publiskā piekļuves metode modificē privātos datus, pielāgo modeļa iekšējo stāvokli un izsauc tos setChanged () metode, kas norāda, ka tā stāvoklis ir mainījies. Tad zvana paziņot novērotājus () paziņot novērotājiem, ka tas ir mainījies. Zvans uz paziņot novērotājus () varētu veikt arī citur, piemēram, atjaunināšanas ciklā, kas darbojas citā pavedienā.
  3. The Atjaunināt() tiek sauktas metodes par katru novērotāju, norādot, ka ir notikušas izmaiņas stāvoklī. Novērotāji piekļūst modeļa datiem, izmantojot modeļa publiskās piekļuves metodes, un atjaunina savus attiecīgos uzskatus.

Novērotājs / novērojams MVC arhitektūrā

Apskatīsim piemēru, kas parāda, kā novērojamie un novērotāji parasti darbojas kopā MVC arhitektūrā. Tāpat kā modelis ObservableValue (1. saraksts) šajā piemērā esošais modelis ir ļoti vienkāršs. Tās iekšējo stāvokli veido viena vesela skaitļa vērtība. Ar valsti manipulē tikai, izmantojot tādas piekļuves metodes kā ObservableValue. Modeļa kods ir atrodams šeit.

Sākumā tika uzrakstīts vienkāršs teksta skats / kontroliera klase. Klase apvieno gan skata (tas teksta veidā parāda modeļa pašreizējā stāvokļa vērtību), gan kontroliera funkcijas (tas ļauj lietotājam ievadīt jaunu modeļa stāvokļa vērtību). Kods ir atrodams šeit.

Projektējot sistēmu, izmantojot MVC arhitektūru (nevis modeļa, skata un teksta kontroliera iegulšanu vienā monolītā klasē), sistēmu var viegli pārveidot, lai tā darbotos ar citu skatu un citu kontrolieri. Šajā gadījumā tika uzrakstīts slīdņa skats / kontroliera klase. Slīdņa pozīcija parāda modeļa pašreizējā stāvokļa vērtību, un lietotājs to var pielāgot, lai modeļa stāvoklim iestatītu jaunu vērtību. Kods ir atrodams šeit.

Par autoru

Kopš datori kļuva pieejami galddatoru modeļos, Tods Sundsteds raksta programmas. Lai arī sākotnēji Tods interesējās par izplatīto objektu lietojumprogrammu izveidi C ++, Tods pārcēlās uz Java programmēšanas valodu, kad Java kļuva par acīmredzamu izvēli šāda veida lietām.

Šo stāstu "Novērotājs un novērojams" sākotnēji publicēja JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found