Design Pattern-Command Design Pattern Simplified

sok parancs minta magyarázat odakinn, de találtam, hogy egy kicsit nehéz megemészteni, vagy megérteni a példát adott azok blogok/Hozzászólások.
tehát itt megpróbálom elmagyarázni, ahogy megértettem.

a parancsminta megértéséhez menjünk vissza az 1990-es évekbe, amikor hatalmas TV-k voltak távirányító nélkül(legalábbis Indiában). Régi szép idők 😉

minden gombunk volt a be – /kikapcsoláshoz, a hangerő növeléséhez/csökkentéséhez.

minden jó volt, jól működött, az egyetlen probléma az volt, hogy ha valaki be/ki akarta kapcsolni a TV-t, vagy csökkenteni/növelni a hangerőt, akkor egészen a TV-hez kellett mennie, és használnia a gombot.

most gondold ezt objektum-orientált módon. A TV olyan objektum, amely egy csomó művelettel/módszerrel / funkcióval vagy “paranccsal”rendelkezik. Közvetlenül hozzáférünk a TV objektumhoz, hogy meghívjuk ezeket a parancsokat.

a probléma ezzel a megközelítéssel?

  1. meg kell az objektumot, hogy meghívja a parancsot-így séta egészen a TV
  2. minden TV saját végrehajtása start / stop, és nem vagyunk képesek újra használni a “Command invocation”
  3. ha egy másik eszköz azt mondják, “Set-Top Box” akarja ugyanazt a funkciót, nem lehet újra használni ugyanazokat a műveleteket — “Universal Remote”

hogyan tudjuk megoldani ezt?

képzeljük el, hogy a TV-nek van egy interfésze, amely megvalósítja az on/off és más funkciókat, és felfedi ezeket a módszereket/műveleteket azáltal, hogy az interfész példányát egy “másik objektumnak”adja. Ez megoldhatja a problémánkat. Menjünk be a kódba:

először létrehozunk egy TV-osztályt, amelynek a műveletei be/ki vannak kapcsolva.

IDevice.java
TV.java

hasonlóképpen létrehozunk egy Set-top box osztályt, mivel univerzális távirányítót hozunk létre.

SetTopBox.java

most, hogy meghatároztuk eszközeinket és műveleteinket, szükségünk van egy osztályra(parancsra), amely képes megtartani a TV/SetTopBox objektumait, és meghívni ezeket a műveleteket.

hozzuk létre a parancs osztályunkat. Mivel két műveletet akarunk végrehajtani ezeken az eszközökön, a Parancsosztály “rendelkezik” egy IDevice típusú objektummal.
Két “be” és “ki”parancsra van szükségünk.
ezeknek a Be/Ki parancsobjektumoknak egy végrehajtási funkciója / metódusa lesz, amely meghívja a megfelelő műveletet az eszközön.

ha észrevetted, az osztályokat “OnCommad” néven hoztam létre, nem pedig “TVOnCommand”néven. Az ötlet az, hogy újra felhasználja a parancsosztályt különböző eszközökhöz. Ez az univerzális parancsunk, amely bármilyen eszközt támogat.
ez lehetővé teszi számunkra, hogy univerzális távirányítót hozzunk létre. Bingó!!!!

eddig az eszköz műveleteit “parancs”formájában vettük ki. Az egyetlen dolog, ami számunkra marad, egy távoli létrehozásavezérlés, a “parancs”elindításához.

mielőtt létrehoznánk a távirányítót, létre kell hoznunk gombokat, és minden gomb végrehajtja a megfelelő parancsot.

a RemoteButton osztály rendelkezik egy parancsobjektummal, amely a gomb megnyomásakor végrehajtásra kerül.

távoli gomb.java

végül hozzuk létre Távirányítónkat, amelynek minden művelethez több gombja lesz.
amikor létrehozunk egy távvezérlő eszközt(konstruktor használatával), az összes objektumot példányosítjuk és hozzárendeljük.

RemoteControlDevice.java

ha megnézed a fenti kódot, több gombot definiáltunk a Távirányítónkban, és megpróbálunk univerzális távirányítót készíteni.

mindannyian készen állunk a RemoteControlDevice létrehozására és lejátszására 🙂

kimenet:

TV is on!
TV is off!
SetTopBox is on!
SetTopBox is off!Process finished with exit code 0

amint a kimeneten látható, különböző gombokat nyomtam meg, hogy egy sor műveletet hajtsak végre az eszközökön.

röviden tehát az ötlet az, hogy az ügyfélnek(psvm/TV felhasználónak) távvezérlőt adjon, ahelyett, hogy egészen a TV-hez sétálna, vagy TV-t adna a TV be – /kikapcsolásához 😀

következtetés

ebben a bejegyzésben a Parancstervezési mintáról beszéltünk.
egyszerű szavakkal:

az ötlet az, hogy a műveleteket egy másik objektumba(parancsba) foglalja be, majd újra felhasználja, majd több gombot hoz létre ezeknek a parancsobjektumoknak a végrehajtásához, amelyekben Eszközműveletek vannak.

mint általában, az összes kódot megtalálhatja a GitHub-on.

You might also like

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.