Vzorec oblikovanja fasade v PHP. Oblikovalski vzorci: Analogija fasade iz življenja

Opis Remote Facade

Zagotavlja skupen vmesnik za poenotenje nabora objektnih metod za izboljšanje učinkovitosti mreženja.

Vzorec oddaljene fasade v objektno usmerjenem modelu izboljša delo z majhnimi predmeti, ki imajo majhne metode. Majhne tehnike ponujajo velike možnosti za nadzor in spreminjanje vedenja ter izboljšanje naročnikovega razumevanja aplikacije. Ena od posledic tega natančnega vedenja je, da med objekti običajno obstaja veliko interakcij z veliko klici metod.

V enem naslovnem prostoru "fino zrnate" interakcije delujejo dobro, vendar se vse spremeni, ko pride do interakcije med procesi. Oddaljeni klici so dražji, ker je treba narediti veliko: včasih je treba podatke organizirati, preveriti varnost, pakete je treba usmeriti na stikala. Če dva procesa delujeta na različnih koncih sveta, lahko celo svetlobna hitrost igra vlogo. Trda resnica je, da je vsaka medprocesna komunikacija za rede velikosti bolj potratna kot klici znotraj procesa. Tudi če se oba procesa izvajata na istem računalniku. Tega vpliva na zmogljivost ne morejo spregledati niti leni navdušenci nad optimizacijo.

Posledično vsak predmet, ki je vključen v oddaljeno delovanje, potrebuje bolj splošen vmesnik, ki zmanjša število zahtev, potrebnih za nekaj. To ne vpliva samo na metode, ampak tudi na predmete. Namesto da zahtevate račun in vse njegove postavke ločeno, morate prebrati in posodobiti vse postavke računa v eni zahtevi. To vpliva na celotno strukturo objekta. Pozabiti moramo na dober namen majhnih predmetov in majhnih metod. Programiranje postaja vse težje, produktivnost pada in pada.

Vzorec oddaljene fasade predstavlja splošno »fasado« (v skladu z GoF) na vrhu strukture bolj »drobnozrnatih« predmetov. Noben od teh objektov nima oddaljenega vmesnika in oddaljena fasada ne vključuje nobene poslovne logike. Vse, kar naredi Remote Facade, je prevajanje splošnih zahtev v nabor majhnih zahtev za podrejene objekte.

11. marec 2010 ob 10.30

Oblikovalski vzorec "Fasada" / "Fasada"

  • Popolna koda

Opis drugih vzorcev.

Težava

Zmanjšajte odvisnost podsistemov nekega kompleksnega sistema in izmenjavo informacij med njimi.

Opis

Pri načrtovanju kompleksnih sistemov se uporablja t.i princip dekompozicije, pri katerem kompleksen sistem razbijemo na manjše in enostavnejše podsisteme. Poleg tega stopnjo razgradnje (njeno globino) določi izključno projektant. Zahvaljujoč temu pristopu je mogoče posamezne komponente sistema razviti ločeno in jih nato integrirati skupaj. Pojavi pa se težava, ki je očitna na prvi pogled - visoka povezljivost sistemskih modulov. To se kaže predvsem v veliki količini informacij, ki si jih moduli izmenjujejo med seboj. Poleg tega morajo imeti nekateri moduli za takšno komunikacijo dovolj informacij o naravi drugih modulov.

Tako je zmanjšanje odvisnosti podsistemov in zmanjšanje količine informacij, ki se prenašajo med njimi, ena glavnih nalog načrtovanja.

Eden od načinov za rešitev te težave je uporaba vzorca "Fasada".

Fasadni vzorec zagotavlja poenoten vmesnik namesto niza podsistemskih vmesnikov. Fasada definira vmesnik na višji ravni, ki
To poenostavlja uporabo podsistema.

Preprosto povedano, "Fasada" ni nič drugega kot objekt, ki zbira nabor operacij na visoki ravni za delo z nekim kompleksnim podsistemom. Fasada združuje razrede, ki izvajajo funkcionalnost tega podsistema, vendar jih ne skriva. Pomembno je razumeti, da odjemalec hkrati ni prikrajšan za dostop na nižji ravni do razredov podsistema, če ga seveda potrebuje. Fasada poenostavlja določene operacije s podsistemom, vendar ne vsiljuje naročniku njegove uporabe.

Praktični problem

Z uporabo vzorca “Fasada” bomo implementirali poenoten vmesnik do nekega avtorizacijskega podsistema uporabnikov. Sam avtorizacijski podsistem (v tem primeru) se zagotovo ne pretvarja, da je "kompleksen sistem", vendar jasno odraža glavne prednosti vzorca.

Razredni diagram

Poglejmo diagram. Ogrodje avtorizacijskega podsistema je zaradi jasnosti označeno s pravokotnikom. Fasada Authorizator zagotavlja naročniku enoten vmesnik za delo s podsistemom. V tem primeru obstaja le ena metoda - authorize(), lahko pa jih je več. V tem primeru lahko stranka uporabi fasado za delo s podsistemom ali pa neposredno uporabi razrede, ki jo sestavljajo. Sam postopek avtorizacije je precej preprost. Na podlagi uporabniškega imena se prek vmesnika DB išče ustrezen vnos v bazi. Nato se geslo najdenega vnosa primerja z geslom, ki ga določi uporabnik.

Implementacija v C#

V izvedbeni kodi št razred PgSQLDB.
z uporabo sistema;
z uporabo System.Collections.Generic ;
z uporabo System.Linq;
z uporabo System.Text;
z uporabo System.Security;

imenski prostor Fasada
{
//Abstrakten uporabniški razred
abstraktni razred Uporabnik
{
uporabniško ime zaščitenega niza;
zaščiten niz passwd;

javni abstraktni niz getUserRole();

javni niz getPasswdHash()
{
// Ta vrstica nima nobenega semantičnega pomena.
// Seveda nam to da nevarno zgoščeno vrednost gesla
return passwd.GetHashCode().ToString();
}
}

// Določite uporabnika kot privzetega uporabnika
razred Privzeti uporabnik: uporabnik
{
public DefaultUser(niz uporabniško ime, niz geslo)
{
to .username = uporabniško ime;
to .passwd = passwd;
}


{
vrni "DEFAULT_USER" ;
}
}

// Določite uporabnika kot skrbnika
Administrator razreda: Uporabnik
{
javni skrbnik (niz uporabniško ime, niz geslo)
{
to .username = uporabniško ime;
to .passwd = passwd;
}

javni preglasitveni niz getUserRole()
{
vrni "SKRBNIK" ;
}

// Vmesnik za dostop do baze podatkov
vmesnik DB
{
Iskanje uporabnika (niz uporabniško ime);
}

// Implementacija vmesnika baze podatkov za SQLite
razred SQLiteDB:DB
{
javni SQLiteDB(ime datoteke niza)
{
// Inicializacija gonilnika baze podatkov
}

javno iskanje uporabnikov (uporabniško ime niza)
{
// Škrbina
vrzi novo NotImplementedException();
}
}

// Pooblastilo uporabnika
public void avtoriziraj (niz uporabniško ime, niz geslo)
{
DB db = nov SQLiteDB("db.sqlite");
Uporabnik uporabnik = db.search(uporabniško ime);
if (user.getPasswdHash() == passwd)
{
// vse je v redu, uporabnik je prepoznan
}
drugače
{
// Nekaj ​​je šlo narobe
throw new SecurityException("Napačno geslo ali uporabniško ime!");
}
}
}

razredni program
{
statična praznina Main(string args)
{
// Fiktivni uporabnik
niz uporabniško ime = "Vasya" ;
niz passwd = "qwerty" .GetHashCode().ToString();

Auth Authorizer = new Authorizer();
poskusi
{
auth.authorizate(uporabniško ime, geslo);
}
catch (SecurityException ex)
{
// Uporabnik ni overjen
}
}
}
}


* Ta izvorna koda je bila označena z označevalnikom izvorne kode.

PS: Sem edina, ki ji habraeditor ne dela?

Namen vzorca fasade

  • Fasadni vzorec zagotavlja poenoten vmesnik namesto nabora podsistemskih vmesnikov. Facade definira vmesnik višje ravni, ki olajša uporabo podsistema.
  • Vzorec Facade ovije kompleksen podsistem s preprostejšim vmesnikom.

Problem, ki ga je treba rešiti

Stranke želijo poenostavljen vmesnik do celotne funkcionalnosti kompleksnega podsistema.

Razprava o vzorcu fasade

Vzorec Facade enkapsulira kompleksen podsistem v en sam objekt vmesnika. To skrajša čas, potreben za učenje podsistema, in tudi pomaga zmanjšati stopnjo povezovanja med podsistemom in potencialno velikim številom odjemalcev. Po drugi strani pa, če je fasada edina dostopna točka do podsistema, bo omejila zmožnosti, ki jih morda potrebujejo napredni uporabniki.

Objekt Facade, ki izvaja posredniške funkcije, bi moral ostati dokaj preprost in ne bi smel biti vsevedni "prerok".

Struktura vzorca fasade

Stranke komunicirajo s podsistemom preko Facade. Ko prejme zahtevo od odjemalca, jo objekt Facade posreduje želeni komponenti podsistema. Za naročnike komponente podsistema ostajajo »skrivnost, zavita v temo«.

Podsistema SubsystemOne in SubsystemThree ne sodelujeta neposredno z notranjimi komponentami podsistema SubsystemTwo. Uporabljajo "fasado" SubsystemTwoWrapper (tj. abstrakcijo višje ravni).

Vzorec fasade definira enoten vmesnik na visoki ravni za podsistem, kar olajša uporabo. Kupci se pri telefonskem naročanju kataloških izdelkov soočijo s fasado. Kupec pokliče službo za pomoč strankam in našteje artikle, ki jih želi kupiti. Predstavnik storitve deluje kot »fronta« in zagotavlja vmesnik do oddelka za dostavo, prodajnega oddelka in dostavne službe.

  • Definirajte preprost, enoten vmesnik za podsistem.
  • Oblikujte razred "ovijalnik", ki enkapsulira podsistem.
  • Celotna kompleksnost podsistema in interakcija njegovih komponent sta odjemalcem skrita. "Fasada"/"ovitek" posreduje uporabniške zahteve ustreznim metodam podsistema.
  • Naročnik uporablja samo »fasado«.
  • Razmislite o izvedljivosti ustvarjanja dodatnih "fasad".

Značilnosti vzorca fasade

  • Facade definira nov vmesnik, Adapter pa uporablja obstoječega. Ne pozabite, Adapter poskrbi, da dva obstoječa vmesnika delujeta skupaj, ne da bi ustvarila nova.
  • Medtem ko Flyweight prikazuje, kako narediti veliko majhnih predmetov, Facade pokaže, kako narediti en sam predmet, ki predstavlja celoten podsistem.
  • Mediator je podoben Facade v tem, da abstrahira funkcionalnost obstoječih razredov. Vendar pa Mediator centralizira funkcionalnost med enakovrednimi objekti, ki ni lastna nobenemu od njih. Preko Mediatorja si sodelavci med seboj izmenjujejo informacije. Po drugi strani pa Facade definira preprost vmesnik za podsistem, ne dodaja nove funkcionalnosti in ni poznan razredom podsistema.
  • Abstract Factory se lahko uporablja kot alternativa Facade za skrivanje razredov, specifičnih za platformo.
  • "Fasadni" objekti so pogosto enojni, ker je potreben samo en fasadni objekt.
  • Adapter in fasada sta oba ovoja, vendar sta različni vrsti ovojev. Cilj Facade je ustvariti preprostejši vmesnik, cilj Adapterja je prilagoditi obstoječi vmesnik. Fasada običajno ovije več predmetov, Adapter ovije en objekt.

Izvedba vzorca fasade

Razčlenitev sistema na komponente zmanjša njegovo kompleksnost. Povezave med komponentami sistema lahko zrahljate z vzorcem fasade. Fasadni objekt zagotavlja enoten, poenostavljen vmesnik za komponente sistema.

Spodnji primer modelira sistem omrežnih storitev. FacilitiesFacade skriva notranjo strukturo sistema. Uporabnik, ko enkrat odda zahtevo za servis, nato 1-2 krat tedensko 5 mesecev povprašuje o poteku del, dokler njegova zahteva ni v celoti servisirana.

#vključi class MisDepartment ( public: void submitNetworkRequest() ( _state = 0; ) bool checkOnStatus() ( _state++; if (_state == Complete) return 1; return 0; ) private: enum States ( Received, DenyAllKnowledge, ReferClientToFacilities, FacilitiesHasNotSentPaperwork, ElectricianIsNotDone , ElectricianDidItWrong, 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, EngineerLeavesCompany , AssignToNewEngineer, NewEngineerResearches, ReassignEngineer, EngineerReturns, EngineerResearchesAgain, EngineerFillsOutPaperWork, Complete); int _state; ); class FacilitiesFacade ( public: FacilitiesFacade() ( _count = 0; ) void submitNetworkRequest() ( _state = 0; ) bool checkOnStatus() ( _count++; /* Prejeta zahteva za storitev */ if (_state == Prejeto) ( _state++; / * Preusmeri zahtevo k inženirju */ _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; }

Izhod programa:

posredovan objektom - 1 telefonski klic do zdaj poslan električarju - 12 telefonskih klicev do zdaj posredovanih MIS - 25 telefonskih klicev do zdaj delo opravljeno po samo 35 telefonskih klicih

Fasada je strukturni načrtovalni vzorec, ki zagotavlja preprost vmesnik za kompleksen razredni sistem, knjižnico ali ogrodje.

Težava

Vaša koda mora delovati z velikim številom objektov iz neke kompleksne knjižnice ali ogrodja. Te objekte morate inicializirati sami, zagotoviti, da so odvisnosti v pravilnem vrstnem redu itd.

Posledično je poslovna logika vaših razredov tesno prepletena s podrobnostmi izvedbe razredov tretjih oseb. Takšno kodo je precej težko razumeti in vzdrževati.

rešitev

Fasada je preprost vmesnik za delo s kompleksnim podsistemom, ki vsebuje veliko razredov. Fasada ima lahko skrajšan vmesnik, ki nima 100 % funkcionalnosti, ki jo je mogoče doseči z neposredno uporabo kompleksnega podsistema. Vendar zagotavlja točno tiste lastnosti, ki jih stranka potrebuje, vse ostalo pa skriva.

Facade je uporaben, če uporabljate kompleksno knjižnico z veliko gibljivimi deli, vendar potrebujete le del njenih zmogljivosti.

Na primer, program, ki nalaga videoposnetke mačk na družbena omrežja, lahko uporablja profesionalno knjižnico za stiskanje videa. Toda vsa odjemalska koda za ta program je preprosta metoda kodiranja (ime datoteke, oblika). Z ustvarjanjem razreda s to metodo implementirate svojo prvo fasado.

Analogija iz življenja


Ko pokličete trgovino in naročite po telefonu, je predstavnik službe za stranke vaša vhodna vrata do vseh služb in oddelkov trgovine. Omogoča vam poenostavljen vmesnik do sistema za ustvarjanje naročil, plačilnega sistema in dostavnega oddelka.

Struktura



    Fasada omogoča hiter dostop do določenih funkcij podsistema. "Ve", kateri razredi morajo posredovati zahtevo in kateri podatki so potrebni za to.

    Dodatna fasada lahko uvedemo tako, da ne »natrpamo« posamezne fasade s heterogeno funkcionalnostjo. Uporablja se lahko tako za naročnika kot za druge fasade.

    Kompleksni podsistem je sestavljen iz številnih različnih razredov. Da bi jih prisilili k nečemu, morate poznati podrobnosti strukture podsistema, vrstni red inicializacije objektov itd.

    Razredi podsistema ne vedo za obstoj fasade in neposredno sodelujejo drug z drugim.

    Stranka uporablja fasado namesto neposrednega dela z objekti kompleksnega podsistema.

Psevdokoda

V tem primeru Fasada poenostavlja delo s kompleksnim ogrodjem za pretvorbo videa.


Primer izolacije več odvisnosti v eni fasadi.

Namesto neposrednega dela z ducatom razredov fasada programski kodi zagotavlja eno samo metodo za pretvorbo videa, ki sama poskrbi za pravilno konfiguracijo potrebnih okvirnih objektov in pridobitev zahtevanega rezultata.

// Razredi za kompleksno ogrodje za pretvorbo videa tretjih oseb. // Te kode ne nadzorujemo, zato je ne moremo poenostaviti. razred VideoFile // ... razred OggCompressionCodec // ... razred MPEG4CompressionCodec // ... razred CodecFactory // ... razred BitrateReader // ... razred AudioMixer // ... // Namesto tega ustvarimo Facade - preprost vmesnik za delo // s kompleksnim ogrodjem. Fasada nima vseh funkcionalnosti // ogrodja, vendar svojo kompleksnost skriva pred strankami. class VideoConverter je metoda convert(ime datoteke, oblika):Datoteka je datoteka = nova VideoFile(ime datoteke) sourceCodec = new CodecFactory.extract(file) if (format == "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) // Aplikacija ni odvisna od zapletenega pretvorbeni okvir // video. Mimogrede, če se nenadoma odločite spremeniti ogrodje, // boste morali samo prepisati razred fasade. class Application je metoda main() is convertor = new VideoConverter() mp4 = convertor.convert("funny-cats-video.ogg", "mp4") mp4.save()

Uporabnost

Ko morate kompleksnemu podsistemu predstaviti preprost ali okrnjen vmesnik.

Pogosto postanejo podsistemi bolj zapleteni, ko se program razvija. Uporaba večine vzorcev povzroči pojav manjših razredov, vendar v večjem številu. Takšen podsistem je lažje ponovno uporabiti in ga vsakič prilagoditi specifičnim potrebam, hkrati pa postane težje uporabljati podsistem brez prilagajanja. Fasada privzeto ponuja določen tip sistema, ki ustreza večini strank.

Ko želite podsistem razstaviti na ločene plasti.

Uporabite fasade za določitev vstopnih točk na vsako raven podsistema. Če so podsistemi odvisni drug od drugega, potem je odvisnost mogoče poenostaviti tako, da podsistemom omogočimo izmenjavo informacij samo prek fasad.

Za primer vzemimo isti zapleten sistem za pretvorbo videa. Razčleniti ga želite na plasti avdio in video dela. Za vsakega od teh delov lahko poskusite ustvariti fasado in omogočite, da razredi za obdelavo zvoka in videa komunicirajo med seboj prek teh fasad, namesto neposredno.

Izvedbeni koraki

    Ugotovite, ali je mogoče ustvariti enostavnejši vmesnik od tistega, ki ga ponuja kompleksen podsistem. Na pravi poti ste, če ta vmesnik odpravlja potrebo, da odjemalec pozna podrobnosti podsistema.

    Ustvarite razred fasade, ki implementira ta vmesnik. Klice odjemalcev mora posredovati pravilnim objektom podsistema. Fasada bo morala poskrbeti za pravilno inicializacijo objektov podsistema.

    Največjo korist boste imeli, če bo naročnik delal samo s fasado. V tem primeru bodo spremembe v podsistemu vplivale samo na kodo fasade, koda odjemalca pa bo ostala delujoča.

Fasada je vedenjski oblikovalski vzorec. Ta vzorec vam omogoča, da skrijete kompleksnost sistema tako, da zmanjšate vse možne klice na en sam objekt, ki jih prenese na ustrezne sistemske objekte.

Najenostavnejša shema delovanja vzorca:

Predstavljajmo si, da pišemo programsko opremo za mikrovalovno pečico. Za poenostavitev si predstavljajmo, da ima samo naslednje funkcije: zavijanje levo in desno, nastavitev zahtevane moči, obveščanje o začetku in koncu dela.

Če želite pripraviti okusno jed, nekaj pogreti ali odmrzniti, morate izvesti določeno število različnih dejanj v določenem zaporedju. Na primer, pri odmrzovanju je treba, začenši z visokimi močmi, večkrat ponastaviti moč, medtem ko vrtite ploščad z izdelkom.

Če bi moral uporabnik sam slediti vsakemu koraku postopka, bi bilo to zelo zamudno in neučinkovito. Navsezadnje vsi vedo, da je v sodobni mikrovalovni pečici dovolj, da izberete želeni program in pritisnete start, po katerem bo naredil vse, kar je potrebno, in po zaključku bo obvestil uporabnika.

Vzorec oblikovanja fasade obravnava prav takšne primere. Omogoča vam, da skrijete vso zapletenost procesa za preprostim vmesnikom.

Ustvarimo razrede za delovanje mikrovalovnega pogona (vrtenje), napajanje in obveščanje.

V voznem razredu bosta samo 2 akciji: zavijanje desno in zavijanje levo.

Class Drive ( public void TurlLeft() ( Console.WriteLine("Rotate Left"); ) public void TurlRight() ( Console.WriteLine("Rotate Right"); ) )

V razredu, ki določa moč, je dodana lastnost za pridobivanje in nastavitev zahtevane moči dela.

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

V razred obveščanja so dodane metode za obveščanje o začetku in koncu dela.

Class Notification ( public void StopNotification() ( Console.WriteLine("Peak-peak-peak - operacija je končana"); ) public void StartNotification() ( Console.WriteLine("Peak - proces kuhanja se je začel"); ) )

Ostaja le še implementacija samega razreda mikrovalovne pečice. V tem primeru bo to tudi fasada. Pri pouku izvajamo metode odmrzovanja in segrevanja živil.

Razred Microwave ( private Drive _drive; private Power _power; private Notification _notification; public Microwave(Drive drive, Power power, Notification notification) ( _drive = pogon; _power = power; _notification = notification; ) public void Defrost() ( _notification.StartNotification () ; _drive.TurlRight(); _power.MicwavePower = 0; _notification.StopNotification(); ) public void Heating() ( _notification.StartNotification(); _power.MicwavePower = 350; _drive.TurlRight(); _drive.TurlRight(); _drive.TurlRight(); _drive.TurlRight(); _drive.TurlRight(); _drive.TurlLeft(); _drive.TurlLeft(); _drive.TurlRight(); _drive.TurlRight(); _drive.TurlLeft(); _drive. TurlLeft(); _drive.TurlLeft(); _drive.TurlLeft(); _power.MicrowavePower = 0; _notification.StopNotification(); ) )

To je vse, primer je pripravljen, ostane le še, da ga preizkusimo.

Var pogon = nov pogon(); var power = new Power(); var obvestilo = novo obvestilo(); var microwave = new Microwave.Microwave(pogon, moč, obvestilo); Console.WriteLine("Odmrzni"); mikrovalovna pečica.Odtaljevanje(); Console.WriteLine(); Console.WriteLine("Ogrejmo"); mikrovalovna pečica.Ogrevanje();

Rezultat bo naslednji:


Podobni članki

2023 ap37.ru. Vrt. Okrasni grmi. Bolezni in škodljivci.