Návrhový vzor fasády v PHP. Dizajnové vzory: Fasádna analógia zo života

Popis vzdialenej fasády

Poskytuje spoločné zjednocujúce rozhranie pre súbor objektových metód na zlepšenie efektivity siete.

Vzor Vzdialená fasáda v objektovo orientovanom modeli zlepšuje prácu s malými objektmi, ktoré majú malé metódy. Malé techniky ponúkajú veľké príležitosti na kontrolu a zmenu správania a na zlepšenie klientovho chápania aplikácie. Jedným z dôsledkov tohto jemného správania je, že medzi objektmi zvyčajne existuje veľa interakcií s množstvom volaní metód.

V jednom adresnom priestore fungujú „jemnozrnné“ interakcie dobre, ale všetko sa zmení, keď dôjde k interakcii medzi procesmi. Vzdialené hovory sú drahšie, pretože je potrebné urobiť veľa: niekedy je potrebné zorganizovať údaje, skontrolovať bezpečnosť, pakety musia byť smerované na prepínačoch. Ak na rôznych koncoch sveta fungujú dva procesy, môže hrať úlohu aj rýchlosť svetla. Tvrdou pravdou je, že akákoľvek medziprocesová komunikácia je rádovo zbytočnejšia ako vnútroprocesné volania. Aj keď oba procesy bežia na rovnakom počítači. Tento vplyv na výkon nemôžu prehliadnuť ani leniví nadšenci optimalizácie.

Výsledkom je, že každý objekt, ktorý je zapojený do diaľkového ovládania, potrebuje všeobecnejšie rozhranie, ktoré minimalizuje počet požiadaviek potrebných na vykonanie niečoho. To ovplyvňuje nielen metódy, ale aj objekty. Namiesto toho, aby ste si vyžiadali faktúru a všetky jej položky samostatne, musíte si prečítať a aktualizovať všetky položky faktúry v jednej žiadosti. To ovplyvňuje celú štruktúru objektu. Musíme zabudnúť na dobrý účel malých predmetov a malých metód. Programovanie je čoraz ťažšie, produktivita klesá a klesá.

Vzor Vzdialená fasáda predstavuje všeobecnú „Fasádu“ (podľa GoF) nad štruktúrou viac „jemnozrnných“ objektov. Žiadny z týchto objektov nemá vzdialené rozhranie a vzdialená fasáda neobsahuje žiadnu obchodnú logiku. Všetko, čo Remote Facade robí, je prekladať všeobecné požiadavky na množinu malých požiadaviek na podriadené objekty.

11. marca 2010 o 10:30

Dizajnový vzor "Fasáda" / "Fasáda"

  • Perfektný kód

Popis iných vzorov.

Problém

Minimalizovať závislosť podsystémov nejakého zložitého systému a výmenu informácií medzi nimi.

Popis

Pri navrhovaní zložitých systémov, tzv princíp dekompozície, pri ktorom sa zložitý systém rozkladá na menšie a jednoduchšie podsystémy. Navyše úroveň rozkladu (jeho hĺbku) určuje výlučne projektant. Vďaka tomuto prístupu môžu byť jednotlivé komponenty systému vyvíjané izolovane a následne integrované. Vzniká však problém, ktorý je zrejmý na prvý pohľad – vysoká konektivita modulov systému. Prejavuje sa to predovšetkým vo veľkom množstve informácií, ktoré si moduly medzi sebou vymieňajú. Navyše pre takúto komunikáciu musia mať niektoré moduly dostatočné informácie o povahe iných modulov.

Minimalizácia závislosti subsystémov, ako aj zníženie množstva informácií prenášaných medzi nimi, je teda jednou z hlavných úloh návrhu.

Jedným zo spôsobov, ako vyriešiť tento problém, je použiť vzor „Fasáda“.

Vzor fasády poskytuje jednotné rozhranie namiesto množiny rozhraní podsystémov. Fasáda definuje rozhranie vyššej úrovne, ktoré
To zjednodušuje používanie subsystému.

Jednoducho povedané, „fasáda“ nie je nič iné ako objekt, ktorý akumuluje súbor operácií na vysokej úrovni pre prácu s nejakým zložitým podsystémom. Fasáda agreguje triedy, ktoré implementujú funkcionalitu tohto subsystému, ale neskrýva ich. Je dôležité pochopiť, že klient zároveň nie je zbavený prístupu nižšej úrovne k triedam podsystému, ak to, samozrejme, potrebuje. Fasáda zjednodušuje určité operácie so subsystémom, ale nevnucuje klientovi jeho použitie.

Praktický problém

Pomocou vzoru „Fasáda“ implementujeme jednotné rozhranie do niektorého podsystému autorizácie používateľov. Samotný autorizačný subsystém (v tomto príklade) rozhodne nepredstiera, že je „komplexným systémom“, ale jasne odráža hlavné výhody vzoru.

Diagram triedy

Pozrime sa na diagram. Rámec autorizačného subsystému je kvôli prehľadnosti zvýraznený v obdĺžniku. Fasáda Authorizator poskytuje klientovi jednotné rozhranie pre prácu so subsystémom. V tomto prípade existuje iba jedna metóda - autorizovať (), ale môže ich byť viac. V tomto prípade môže klient použiť fasádu na prácu so subsystémom, alebo môže priamo použiť triedy, ktoré ju tvoria. Samotný proces autorizácie je pomerne jednoduchý. Na základe používateľského mena sa cez DB rozhranie vyhľadá príslušný záznam v databáze. Potom sa heslo nájdenej položky porovná s heslom zadaným používateľom.

Implementácia v C#

V implementačnom kóde Nie trieda PgSQLDB.
pomocou systému;
pomocou System.Collections.Generic ;
pomocou System.Linq;
pomocou System.Text;
pomocou System.Security;

menný priestor fasáda
{
//Abstraktná trieda používateľov
abstraktná trieda Používateľ
{
užívateľské meno chráneného reťazca;
chránený reťazec passwd;

verejný abstrakt reťazec getUserRole();

verejný reťazec getPasswdHash()
{
// Tento riadok nenesie žiadny sémantický význam.
// To nám samozrejme dáva nezabezpečený hash hesla
return passwd.GetHashCode().ToString();
}
}

// Zadajte používateľa ako predvoleného používateľa
class DefaultUser: Používateľ
{
public DefaultUser(reťazec užívateľské meno, string passwd)
{
toto .username = užívateľské meno;
toto .passwd = passwd;
}


{
návrat "DEFAULT_USER" ;
}
}

// Zadajte používateľa ako správcu
Správca triedy: Používateľ
{
verejný administrátor (reťazec používateľské meno, reťazec passwd)
{
toto .username = užívateľské meno;
toto .passwd = passwd;
}

verejné prepísanie reťazca getUserRole()
{
návrat "ADMINISTRÁTOR" ;
}

// Rozhranie prístupu k databáze
rozhranie DB
{
Hľadanie používateľa (reťazec používateľského mena);
}

// Implementácia databázového rozhrania pre SQLite
trieda SQLiteDB:DB
{
public SQLiteDB (reťazec názvu súboru)
{
// Inicializujte ovládač databázy
}

verejné vyhľadávanie používateľov (reťazec používateľského mena)
{
// Stub
hodiť novú NotImplementedException();
}
}

// Autorizácia používateľa
public void autorizovať (reťazec používateľské meno, reťazec passwd)
{
DB db = new SQLiteDB("db.sqlite" );
Používateľ používateľ = db.search(meno používateľa);
if (user.getPasswdHash() == passwd)
{
// všetko je v poriadku, používateľ je rozpoznaný
}
inak
{
// Niečo sa pokazilo
throw new SecurityException("Chybné heslo alebo užívateľské meno!" );
}
}
}

triedny program
{
static void Main (reťazcové argumenty)
{
// Fiktívny používateľ
string meno používateľa = "Vasya" ;
string passwd = "qwerty" .GetHashCode().ToString();

Autorizator auth = new Authorizer();
skúste
{
auth.authorizate(používateľské meno, heslo);
}
catch (Exception Security)
{
// Používateľ nie je overený
}
}
}
}


* Tento zdrojový kód bol zvýraznený pomocou Zvýrazňovača zdrojového kódu.

PS: Som jediný, komu nefunguje habraeditor?

Účel fasádneho vzoru

  • Vzor Facade poskytuje jednotné rozhranie namiesto množiny rozhraní podsystému. Fasáda definuje rozhranie vyššej úrovne, ktoré uľahčuje používanie subsystému.
  • Vzor Facade obaluje zložitý podsystém jednoduchším rozhraním.

Problém, ktorý treba vyriešiť

Zákazníci chcú zjednodušené rozhranie pre celkovú funkčnosť komplexného podsystému.

Diskusia o vzore fasády

Vzor Facade zapuzdruje komplexný podsystém do jedného objektu rozhrania. To skracuje čas potrebný na naučenie sa subsystému a tiež pomáha znižovať stupeň prepojenia medzi subsystémom a potenciálne veľkým počtom klientov. Na druhej strane, ak je fasáda jediným prístupovým bodom k subsystému, obmedzí možnosti, ktoré môžu pokročilí používatelia potrebovať.

Objekt Facade, ktorý implementuje funkcie sprostredkovania, by mal zostať pomerne jednoduchý a nemal by byť vševediacim „orákulom“.

Štruktúra fasádneho vzoru

Klienti komunikujú so subsystémom cez Facade. Keď je od klienta prijatá požiadavka, objekt Facade ju prepošle požadovanému komponentu podsystému. Pre klientov zostávajú komponenty subsystému „záhadou, zahalenou temnotou“.

Subsystémy Subsystem One a SubsystemThree priamo neinteragujú s vnútornými komponentmi podsystému SubsystemTwo. Používajú „fasádu“ SubsystemTwoWrapper (t. j. abstrakciu vyššej úrovne).

Vzor fasády definuje jednotné rozhranie na vysokej úrovni so subsystémom, čo uľahčuje jeho používanie. Kupujúci sa pri telefonickom objednávaní katalógových produktov stretávajú s fasádou. Kupujúci zavolá zákaznícky servis a vymenuje položky, ktoré chce kúpiť. Servisný zástupca vystupuje ako „front“, poskytuje rozhranie pre oddelenie plnenia, obchodné oddelenie a doručovaciu službu.

  • Definujte jednoduché, jednotné rozhranie pre subsystém.
  • Navrhnite triedu „wrapper“, ktorá zapuzdruje subsystém.
  • Celá zložitosť subsystému a interakcia jeho komponentov sú pred klientmi skryté. "Fasáda"/"obal" preposiela požiadavky používateľov príslušným metódam podsystému.
  • Klient využíva len „fasádu“.
  • Zvážte uskutočniteľnosť vytvorenia ďalších "fasád".

Vlastnosti fasádneho vzoru

  • Fasáda definuje nové rozhranie, zatiaľ čo adaptér používa existujúce. Pamätajte, že adaptér umožňuje, aby dve existujúce rozhrania spolupracovali bez vytvárania nových.
  • Kým Flyweight ukazuje, ako vytvoriť veľa malých objektov, Facade ukazuje, ako vytvoriť jeden objekt, ktorý predstavuje celý subsystém.
  • Mediator je podobný Facade v tom, že abstrahuje funkčnosť existujúcich tried. Mediátor však centralizuje funkcie medzi rovnocennými objektmi, ktoré nie sú vlastné ani jednému z nich. Kolegovia si medzi sebou vymieňajú informácie prostredníctvom Mediátora. Na druhej strane, Facade definuje jednoduché rozhranie k subsystému, nepridáva novú funkcionalitu a nie je známa triedam subsystému.
  • Abstract Factory možno použiť ako alternatívu k Facade na skrytie tried špecifických pre platformu.
  • Objekty „Fasáda“ sú často Singleton, pretože je potrebný iba jeden Fasádový objekt.
  • Adaptér a Fasáda sú oba obaly, ale sú to rôzne typy obalov. Cieľom Facade je vytvoriť jednoduchšie rozhranie, cieľom Adapter je prispôsobiť existujúce rozhranie. Fasáda zvyčajne obalí viacero objektov, Adaptér obalí jeden objekt.

Implementácia vzoru fasády

Rozdelenie systému na komponenty znižuje jeho zložitosť. Spoje medzi komponentmi systému môžete uvoľniť pomocou vzoru Fasáda. Fasádny objekt poskytuje jediné, zjednodušené rozhranie pre systémové komponenty.

Nižšie uvedený príklad modeluje systém sieťových služieb. FacilitiesFacade skrýva vnútornú štruktúru systému. Užívateľ, ktorý raz požiadal o servis, sa potom 1-2 krát týždenne počas 5 mesiacov pýta na postup prác, kým nie je jeho požiadavka úplne vybavená.

#include class MisDepartment ( public: void submitNetworkRequest() ( _state = 0; ) bool checkOnStatus() ( _state++; if (_state == Complete) return 1; return 0; ) private: enum States ( Received, DenyAllKnowledge, ReferClientToFacilities, FacilitiesPacilitiesHasNotDotS , ElektrikárDidItWrong, DispatchTechnician, SignedOff, DoesNotWork, FixElectriciansWiring, Complete ); int _state; ); class ElectricianUnion ( public: void submitNetworkRequest() ( _state = 0; ) bool checkOnStatus() ( _state++; if (_state == Complete) return 1; return 0; ) private: enum States ( Received, RejectTheForm, SizeTheJob, SmokeAndJokeBreak, WaitForAuthorization , DoTheWrongJob, BlameTheEngineer, WaitToPunchOut, DoHalfAJob, ComplainToEngineer, GetClarification, CompleteTheJob, TurnInThePaperwork, Complete ); int _state; ); class FacilitiesDepartment ( public: void submitNetworkRequest() ( _state = 0; ) bool checkOnStatus() ( _state++; if (_state == Complete) return 1; return 0; ) private: enum States ( Received, AssignToEngineer, EngineerResearches, RequestIsNotPossible, , AssignToNewEngineer, NewEngineerResearches, ReassignEngineer, EngineerReturns, EngineerResearchesAgain, EngineerFillsOutPaperWork, Complete ); int _state; ); class FacilitiesFacade ( public: FacilitiesFacade() ( _count = 0; ) void submitNetworkRequest() ( _state = 0; ) bool checkOnStatus() ( _count++; /* Prijatá požiadavka na službu */ if (_state == Received) ( _state++; / * Presmerujte požiadavku na inžiniera */ _engineer.submitNetworkRequest(); cout<< "submitted to Facilities - " << _count << " phone calls so far" << endl; } else if (_state == SubmitToEngineer) { /* Если инженер свою работу выполнил, перенаправим запрос электрику */ if (_engineer.checkOnStatus()) { _state++; _electrician.submitNetworkRequest(); cout << "submitted to Electrician - " << _count << " phone calls so far" << endl; } } else if (_state == SubmitToElectrician) { /* Если электрик свою работу выполнил, перенаправим запрос технику */ if (_electrician.checkOnStatus()) { _state++; _technician.submitNetworkRequest(); cout << "submitted to MIS - " << _count << " phone calls so far" << endl; } } else if (_state == SubmitToTechnician) { /* Если техник свою работу выполнил, то запрос обслужен до конца */ if (_technician.checkOnStatus()) return 1; } /* Запрос еще не обслужен до конца */ return 0; } int getNumberOfCalls() { return _count; } private: enum States { Received, SubmitToEngineer, SubmitToElectrician, SubmitToTechnician }; int _state; int _count; FacilitiesDepartment _engineer; ElectricianUnion _electrician; MisDepartment _technician; }; int main() { FacilitiesFacade facilities; facilities.submitNetworkRequest(); /* Звоним, пока работа не выполнена полностью */ while (!facilities.checkOnStatus()) ; cout << "job completed after only " << facilities.getNumberOfCalls() << " phone calls" << endl; }

Výstup programu:

odovzdané do zariadení - 1 telefonát zatiaľ odovzdaný elektrikárovi - doteraz odovzdaných 12 telefonátov na MIS - 25 telefonátov doteraz dokončená úloha len po 35 telefonátoch

Fasáda je štrukturálny návrhový vzor, ​​ktorý poskytuje jednoduché rozhranie pre komplexný systém tried, knižnicu alebo rámec.

Problém

Váš kód musí pracovať s veľkým počtom objektov z nejakej zložitej knižnice alebo rámca. Tieto objekty musíte inicializovať sami, zabezpečiť, aby boli závislosti v správnom poradí atď.

Výsledkom je, že obchodná logika vašich tried je úzko prepojená s detailmi implementácie tried tretích strán. Takýto kód je dosť náročný na pochopenie a údržbu.

Riešenie

Fasáda je jednoduché rozhranie pre prácu s komplexným podsystémom obsahujúcim mnoho tried. Fasáda môže mať oklieštené rozhranie, ktoré nemá 100 % funkčnosti, ktorú možno dosiahnuť priamym použitím zložitého podsystému. Poskytuje však presne tie funkcie, ktoré klient potrebuje a všetko ostatné skrýva.

Fasáda je užitočná, ak používate nejakú komplexnú knižnicu s množstvom pohyblivých častí, no potrebujete len časť jej schopností.

Napríklad program, ktorý nahráva videá mačiek na sociálne siete, môže využívať profesionálnu knižnicu na kompresiu videa. Ale všetok klientsky kód pre tento program potrebuje jednoduchú metódu kódovania (názov súboru, formátu). Vytvorením triedy pomocou tejto metódy implementujete svoju prvú fasádu.

Analógia zo života


Keď zavoláte do obchodu a zadáte objednávku cez telefón, zástupca zákazníckeho servisu je vašimi prednými dverami do všetkých služieb a oddelení obchodu. Poskytuje vám zjednodušené rozhranie pre systém vytvárania objednávok, platobný systém a oddelenie doručenia.

Štruktúra



    Fasáda poskytuje rýchly prístup k určitým funkciám podsystému. „Vie“, ktoré triedy musia poslať požiadavku a aké údaje sú na to potrebné.

    Dodatočná fasáda môžu byť zavedené tak, aby „nezapratali“ jedinú fasádu heterogénnou funkčnosťou. Môže byť použitý ako klientom, tak aj inými fasádami.

    Komplexný subsystém pozostáva z mnohých rôznych tried. Aby ste ich prinútili niečo urobiť, musíte poznať detaily štruktúry subsystému, poradie inicializácie objektov atď.

    Triedy subsystému o existencii fasády nevedia a spolupracujú medzi sebou priamo.

    Zákazník používa fasádu namiesto priamej práce s objektmi komplexného podsystému.

Pseudokód

V tomto príklade Fasáda zjednodušuje prácu s komplexným rámcom konverzie videa.


Príklad izolácie viacerých závislostí v jednej fasáde.

Namiesto priamej práce s tuctom tried poskytuje fasáda aplikačnému kódu jedinú metódu konverzie videa, ktorá sa sama postará o správnu konfiguráciu potrebných rámcových objektov a získanie požadovaného výsledku.

// Triedy pre komplexný rámec konverzie videa tretích strán. Tento kód // nekontrolujeme, takže ho nemôžeme zjednodušiť. class VideoFile // ... class OggCompressionCodec // ... class MPEG4CompressionCodec // ... class CodecFactory // ... class BitrateReader // ... class AudioMixer // ... // Namiesto toho vytvoríme fasádu - jednoduché rozhranie pre prácu // s komplexným rámcom. Fasáda nemá všetky funkcie // kostry, ale pred klientmi skrýva svoju zložitosť. class VideoConverter je metóda convert(názov súboru, formát):Súbor je súbor = nový VideoFile(názov súboru) sourceCodec = nový CodecFactory.extract(file) if (formát == "mp4") destinationCodec = new MPEG4CompressionCodec() else destinationCodec = new OggCompressionCodec( ) buffer = BitrateReader.read(filename, sourceCodec) result = BitrateReader.convert(buffer, destinationCodec) result = (new AudioMixer()).fix(result) return new File(result) // Aplikácia nezávisí od komplexu konverzný rámec / / video. Mimochodom, ak sa náhle rozhodnete zmeniť rámec, // budete musieť prepísať iba triedu fasády. class Aplikácia je metóda main() is convertor = new VideoConverter() mp4 = convertor.convert("funny-cats-video.ogg", "mp4") mp4.save()

Použiteľnosť

Keď potrebujete prezentovať jednoduché alebo obmedzené rozhranie pre zložitý podsystém.

Podsystémy sa často stávajú zložitejšími, keď sa program vyvíja. Výsledkom aplikácie väčšiny vzorov je vzhľad menších tried, ale vo väčšom počte. Je jednoduchšie znovu použiť takýto subsystém, vždy ho prispôsobovať špecifickým potrebám, no zároveň je ťažšie používať subsystém bez prispôsobenia. Fasáda štandardne ponúka určitý typ systému, ktorý vyhovuje väčšine klientov.

Keď chcete rozložiť podsystém na samostatné vrstvy.

Použite fasády na definovanie vstupných bodov do každej úrovne podsystému. Ak sú podsystémy na sebe závislé, potom je možné závislosť zjednodušiť tým, že sa podsystémom umožní vymieňať si informácie iba cez fasády.

Vezmime si napríklad rovnaký komplexný systém konverzie videa. Chcete to rozdeliť na vrstvy práce so zvukom a videom. Pre každú z týchto častí sa môžete pokúsiť vytvoriť fasádu a nechať triedy spracovania zvuku a videa navzájom komunikovať prostredníctvom týchto fasád, a nie priamo.

Kroky implementácie

    Zistite, či je možné vytvoriť jednoduchšie rozhranie, než aké poskytuje komplexný podsystém. Ste na správnej ceste, ak toto rozhranie eliminuje potrebu, aby klient vedel o detailoch subsystému.

    Vytvorte triedu fasád, ktorá implementuje toto rozhranie. Musí presmerovať volania klienta na správne objekty podsystému. Fasáda sa bude musieť postarať o správnu inicializáciu objektov podsystému.

    Maximálny úžitok získate, ak klient pracuje len s fasádou. V tomto prípade zmeny v podsystéme ovplyvnia iba kód fasády a kód klienta zostane funkčný.

Fasáda je behaviorálny dizajnový vzor. Tento vzor vám umožňuje skryť zložitosť systému znížením všetkých možných volaní na jeden objekt, ktorý ich deleguje na zodpovedajúce systémové objekty.

Najjednoduchšia schéma fungovania vzoru:

Predstavme si, že píšeme softvér pre mikrovlnnú rúru. Pre jednoduchosť si predstavme, že má iba nasledujúce funkcie: odbočiť doľava a doprava, nastaviť požadovaný výkon, upozorniť na začiatok a koniec práce.

Ak chcete pripraviť chutné jedlo, niečo ohriať alebo rozmraziť, musíte vykonať určitý počet rôznych akcií v určitom poradí. Napríklad pri odmrazovaní je potrebné, počnúc vysokými výkonmi, niekoľkokrát vynulovať výkon a súčasne otáčať plošinu s výrobkom.

Ak by mal užívateľ sledovať každý krok procesu sám, bolo by to veľmi časovo náročné a neefektívne. Koniec koncov, každý vie, že na modernej mikrovlnnej rúre stačí vybrať požadovaný program a stlačiť štart, potom urobí všetko, čo je potrebné, a po dokončení upozorní používateľa.

Dizajnový vzor fasády sa zaoberá práve takýmito prípadmi. Umožňuje vám skryť všetku zložitosť procesu za jednoduché rozhranie.

Vytvorme triedy pre obsluhu mikrovlnného pohonu (rotáciu), výkon a notifikáciu.

V triede jazdy budú len 2 akcie: odbočiť doprava a odbočiť doľava.

Class Drive ( public void TurlLeft() ( Console.WriteLine("Otočiť doľava"); ) public void TurlRight() ( Console.WriteLine("Rotate Right"); ) )

V triede, ktorá špecifikuje výkon, bola pridaná vlastnosť na získanie a nastavenie požadovaného výkonu práce.

Class Power ( private int _power; public int MicrowavePower ( get ( return _power; ) set ( _power = value; Console.WriteLine("Power set (0)w ", _power); ) ) )

Do triedy upozornení boli pridané metódy na upozorňovanie na začiatok a koniec práce.

Oznámenie o triede ( public void StopNotification() ( Console.WriteLine("Peak-peak-peak - operácia je dokončená"); ) public void StartNotification() ( Console.WriteLine("Peak - proces varenia sa začal"); ) )

Zostáva len implementovať samotnú triedu mikrovlnnej rúry. V tomto príklade to bude aj fasáda. Na hodine realizujeme metódy na rozmrazovanie a ohrievanie jedál.

Trieda mikrovlnnej rúry ( súkromný disk _disk; súkromný výkon _napájanie; súkromné ​​upozornenie _oznámenie; verejné mikrovlnné rúry (pohon, napájanie, upozornenie na upozornenie) ( _jednotka = disk; _napájanie = napájanie; _notifikácia = upozornenie; ) verejné void Defrost() ( _notification.StartNotification (); _power.MicrowavePower = 1000; _drive.TurlRight(); _drive.TurlRight(); _power.MicrowavePower = 500; _drive.TurlLeft(); _drive.TurlLeft(); _power.Mikrovlnný výkon (0)Turl_Drive = 20. ; _drive.TurlRight(); _power.MicrowavePower = 0; _notification.StopNotification(); ) public void Kúrenie() ( _notification.StartNotification(); _power.MicrowavePower = 350; _drive.TurlRight(); lRight(Tur); _drive.TurlRight(); _drive.TurlRight(); _drive.TurlRight(); _drive.TurlLeft(); _drive.TurlLeft(); _drive.TurlRight(); _drive.TurlRight(); _drive.TurlLeft(); TurlLeft(); _drive.TurlLeft(); _drive.TurlLeft(); _power.MicrowavePower = 0; _notification.StopNotification(); ))

To je všetko, príklad je pripravený, zostáva ho už len otestovať.

Var drive = new Drive(); var power = new Power(); var notification = new Notification(); var mikrovlnka = new Microwave.Microwave(drive, power, notification); Console.WriteLine("Unfreeze"); mikrovlnka.Rozmrazovanie(); Console.WriteLine(); Console.WriteLine("Poďme to zahriať"); mikrovlnka.Vykurovanie();

Výsledok bude nasledovný:


Podobné články

2023 ap37.ru. Záhrada. Dekoratívne kríky. Choroby a škodcovia.