există multe explicații ale modelului de comandă acolo, dar mi s-a părut un pic dificil de digerat sau de înțeles exemplul furnizat în acele bloguri/postări.
deci, aici voi încerca să explic în modul în care am înțeles.
pentru a înțelege modelul de comandă, ne întoarcem în anii 1990, când aveam Televizoare uriașe fără telecomandă(cel puțin în India). Vremurile bune 😉
am avut toate butoanele pentru on / off, creșterea/scăderea volumelor.
totul a fost bine, de lucru bine, singura problemă a fost dacă cineva a vrut să porniți televizorul on/off sau reduce/crește volumul, au trebuit să meargă tot drumul la televizor și de a folosi butonul.
acum gândiți-vă la asta într-un mod orientat pe obiecte. Un televizor este un obiect care are o grămadă de operații/metode/funcții sau „Comandă”. Accesăm direct obiectul TV pentru a invoca aceste comenzi.
problema cu această abordare?
- aveți nevoie de obiect pentru a invoca o comandă – prin urmare, mergeți până la televizor
- fiecare televizor are propria sa implementare de pornire / oprire și nu suntem capabili să reutilizăm „invocarea comenzii”
- dacă un alt dispozitiv spune „Set – Top Box” dorește aceeași funcționalitate, nici o modalitate de a reutiliza aceleași operații- „telecomandă universală”
cum putem rezolva asta?
Imaginați-vă că televizorul are o interfață care implementează on/off și alte funcționalități și expune aceste metode/operații, dând instanța interfeței unui „alt obiect”. Asta ne-ar putea rezolva problema. Să intrăm în cod:
în primul rând, vom crea o clasă TV, care au operațiunile on/off.
de asemenea, vom crea o clasă Set-Top box pe măsură ce creăm o telecomandă universală.
acum că ne-am definit dispozitivele și operațiunile sale, avem nevoie de o clasă(comandă) care să poată păstra obiectele TV/SetTopBox și să invoce aceste operații.
să creăm clasa noastră de comandă. Deoarece dorim să efectuăm două operații pe aceste dispozitive, clasa de comandă va „avea” un obiect de tip IDevice.
avem nevoie de două comenzi „ON” și „OFF”.
aceste obiecte de comandă On/Off vor avea o funcție/metodă de execuție, care va invoca operația respectivă pe dispozitivul pe care îl are.
dacă ați observat, am creat clasele cu numele ” OnCommad „și nu”TVOnCommand”. Ideea este de a reutiliza clasa de comandă pentru diferite dispozitive. Aceasta este comanda noastră universală, care acceptă orice dispozitiv.
acest lucru ne va permite să creăm o telecomandă universală. Bingo!!!!
până acum, am abstractizat operațiunile dispozitivului sub forma „comandă”. Singurul lucru rămas pentru noi este să creăm o Telecomandăcontrol, pentru a declanșa „comanda”.
înainte de a crea telecomandă, trebuie să creăm butoane și fiecare buton va executa comanda respectivă.
clasa RemoteButton are un obiect de comandă, care este executat la apăsarea butonului.
în cele din urmă, să creăm dispozitivul nostru de Control de la distanță, care va avea mai multe butoane pentru fiecare operație.
când creăm un dispozitiv de control la distanță (folosind constructor), vom instantia toate obiectele și vom atribui.
dacă te uiți la codul de mai sus, am definit mai multe butoane în telecomanda noastră și încercăm să facem telecomandă universală.
suntem cu toții pregătiți să creăm și să ne jucăm cu RemoteControlDevice-ul nostru:)
ieșire:
TV is on!
TV is off!
SetTopBox is on!
SetTopBox is off!Process finished with exit code 0
după cum se vede în ieșire am apăsat diferite butoane, pentru a efectua un set de operații pe dispozitive.
deci, pe scurt, ideea este de a oferi clientului(utilizatorul psvm/TV) o telecomandă în loc să-i facă să meargă până la televizor sau să dea TV pentru a porni/opri televizorul 😀
concluzie
în acest post, am vorbit despre modelul de proiectare a Comenzii.
în cuvinte simple:
ideea este de a încapsula operațiunile într-un obiect diferit(comandă) și de a reutiliza și apoi de a crea mai multe butoane pentru a executa aceste obiecte de comandă care au operații de dispozitiv în el.
ca de obicei, puteți găsi tot codul pe GitHub meu.