det finns många Kommandomönsterförklaringar där ute, men jag tyckte att det var lite svårt att smälta eller förstå exemplet i dessa bloggar/inlägg.
så här ska jag försöka förklara på det sätt jag förstod.
för att förstå kommandomönstret kan vi gå tillbaka till 1990-talet när vi hade stora TV-apparater utan fjärrkontroll(åtminstone i Indien). Gamla goda dagar 😉
vi hade alla rattar för on/off, öka / minska volymer.
allt var bra, fungerade bra, det enda problemet var om någon ville slå på/stänga av TV: n eller minska/öka volymen, de var tvungna att gå hela vägen till TV: n och använda ratten.
Tänk nu detta på ett objektorienterat sätt. En TV är ett objekt som har en massa operationer/metoder/funktioner eller ”Kommando”. Vi har direkt åtkomst till TV-objektet för att åberopa dessa kommandon.
problemet med detta tillvägagångssätt?
- du behöver objektet för att åberopa ett kommando-därmed gå hela vägen till TV: n
- varje TV har sin egen implementering av start/Stopp och vi kan inte återanvända ”Command invocation”
- om en annan enhet säger ”Set-Top Box” vill ha samma funktionalitet, inget sätt att återanvända samma operationer- ”Universal Remote”
Hur kan vi lösa detta?
Föreställ dig att TV: n har ett gränssnitt som implementerar på/av och annan funktionalitet och exponerar dessa metoder/operationer genom att ge instansen av gränssnittet till ett ”annat objekt”. Det kan lösa vårt problem. Låt oss komma in i kod:
först skapar vi en TV-klass, som har operationerna på/av.
på samma sätt skapar vi en Set-top box-klass när vi skapar en universell fjärrkontroll.
nu när vi har definierat våra enheter och dess operationer behöver vi en klass(kommando) som kan behålla objekt av TV/SetTopBox och åberopa dessa operationer.
Låt oss skapa vår kommandoklass. Eftersom vi vill utföra två operationer på dessa enheter kommer Kommandoklassen att ”ha” ett objekt av IDevice-typ.
vi behöver två kommandon” på ”och”av”.
dessa På/Av-kommandoobjekt kommer att ha en exekveringsfunktion/metod, som kommer att åberopa respektive operation på enheten den har.
om du har märkt har jag skapat klasserna med namnet ”OnCommad” och inte ”TVOnCommand”. Tanken är att återanvända kommandoklassen för olika enheter. Det är vårt universella kommando, som stöder vilken enhet som helst.
detta gör det möjligt för oss att skapa en universell fjärrkontroll. Bingo!!!!
hittills har vi abstraherat enhetsoperationerna i form av ”kommando”. Det enda som återstår för oss är att skapa en Fjärrkontrollkontroll, för att utlösa ”kommandot”.
innan vi skapar fjärrkontroll måste vi skapa knappar och varje knapp kommer att utföra respektive kommando.
RemoteButton-klassen har ett kommandoobjekt som körs när knappen trycks in.
slutligen, låt oss skapa vår fjärrkontroll, som kommer att ha flera knappar för varje operation.
när vi skapar en fjärrkontrollenhet (med konstruktör) kommer vi att instantiera alla objekt och tilldela.
om du tittar på ovanstående kod har vi definierat flera knappar i vår fjärrkontroll och vi försöker göra Universal remote.
vi är alla redo att skapa och spela med vår RemoteControlDevice 🙂
utgång:
TV is on!
TV is off!
SetTopBox is on!
SetTopBox is off!Process finished with exit code 0
som framgår av produktionen har jag tryckt på olika knappar för att utföra en uppsättning operationer på enheterna.
så kort sagt är tanken att ge klienten (psvm/TV-användare) en fjärrkontroll istället för att få dem att gå hela vägen till TV eller ge TV för att slå PÅ/AV TV 😀
slutsats
i det här inlägget pratade vi om Kommandodesignmönstret.
i enkla ord:
tanken är att inkapsla operationerna i ett annat objekt(kommando) och återanvända och sedan skapa flera knappar för att utföra dessa kommandoobjekt som har enhetsoperationer i den.
som vanligt kan du hitta all kod på min GitHub.