Command-malli: toimintojen kapselointi
Paketoi pyynnöt Command-olioiksi kumoamisen, uudelleen tekemisen ja makrojen tallentamisen tukemiseksi.
Command-malli: toimintojen kapselointi on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Java Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Java Academy-kurssilla on yhteensä 4 oppituntia.
Command-kuvion tarkoitus
Command kapseloi pyynnön olioksi, jolloin asiakkaalle voidaan parametrisoida erilaisia pyyntöjä sekä toteuttaa pyyntöjen jonotus, lokitus ja kumottavat toiminnot.
Command-rajapinta
Määritelkää rajapinta, jossa on execute()-metodi ja haluttaessa myös undo()-metodi. Kukin komento-olio tietää, miten yksi toiminto suoritetaan ja peruutetaan.
public interface Command {
void execute();
void undo();
}Konkreettinen Command: TextEditor
Kukin konkreettinen komento kapseloi vastaanottajan ja toiminnon parametrit. Execute suorittaa toiminnon ja undo peruuttaa sen.
public class InsertTextCommand implements Command {
private final TextEditor editor;
private final String text;
private final int position;
public InsertTextCommand(TextEditor editor, String text, int pos) {
this.editor = editor; this.text = text; this.position = pos;
}
public void execute() { editor.insert(position, text); }
public void undo() { editor.delete(position, text.length()); }
}Kutsuja: CommandHistory
Kutsuja ylläpitää suoritettujen komentojen historiaa. Se kutsuu execute()-metodia ja lisää komennon pinoon. Undo poistaa komennon pinosta ja kutsuu undo()-metodia.
public class CommandHistory {
private final Deque<Command> history = new ArrayDeque<>();
public void execute(Command cmd) {
cmd.execute();
history.push(cmd);
}
public void undo() {
if (!history.isEmpty()) history.pop().undo();
}
}Kumoa-/uudelleenpino
Lisätkää uudelleenpino: kun toiminto kumotaan, lisätkää komento uudelleenpinoon; kun toiminto tehdään uudelleen, poistakaa komento uudelleenpinosta ja suorittakaa se uudelleen.
private final Deque<Command> undoStack = new ArrayDeque<>();
private final Deque<Command> redoStack = new ArrayDeque<>();
public void redo() {
if (!redoStack.isEmpty()) {
Command cmd = redoStack.pop();
cmd.execute();
undoStack.push(cmd);
}
}Makrokomento
Makrokomento on yhdistelmäkomento, joka sisältää komentojen luettelon ja suorittaa ne järjestyksessä. Kumottaessa peruutustoiminnot suoritetaan käänteisessä järjestyksessä.
public class MacroCommand implements Command {
private final List<Command> commands;
public MacroCommand(List<Command> commands) { this.commands = commands; }
public void execute() { commands.forEach(Command::execute); }
public void undo() { for (int i = commands.size()-1; i>=0; i--) commands.get(i).undo(); }
}Komentojono tehtävien käsittelyyn
Tallentakaa komennot jonoon ja käsitelkää ne asynkronisesti. Työsäie poistaa komentoja jonosta ja suorittaa ne, jolloin tuottajat irrotetaan suorittavasta säikeestä.
BlockingQueue<Command> queue = new LinkedBlockingQueue<>();
// Producer:
queue.put(new SendEmailCommand(recipient, subject, body));
// Consumer thread:
Command cmd = queue.take();
cmd.execute();Command Executorin kanssa
Ympäröikää komennot Runnable-lambdoiksi ja lähettäkää ne ExecutorService-palvelulle — lambda toimii komento-oliona.
ExecutorService exec = Executors.newFixedThreadPool(4);
exec.submit(() -> sendEmail(recipient, subject));
exec.submit(() -> generateReport(params));Komentojen lokitus auditointia varten
Serializable Command -oliot voidaan tallentaa lokiin. Palautuksen yhteydessä toistakaa komennot lopullisen tilan rekonstruoimiseksi — tämä muodostaa Event Sourcingin perustan.
void execute(Command cmd) {
cmd.execute();
auditLog.append(cmd.toString()); // log every action
history.push(cmd);
}Graafisen käyttöliittymän toimintopainikkeet
Graafisissa käyttöliittymäkehyksissä jokainen painike tai valikkokohde sisältää Command-komennon. Painikkeen napsauttaminen kutsuu command.execute()-metodia. Vaihtamalla komentoja ajon aikana voitte muuttaa painikkeen toimintaa.
Button saveBtn = new Button("Save");
saveBtn.setOnAction(() -> new SaveDocumentCommand(doc).execute());Command ja Strategy
Molemmat kapseloivat toiminnan. Strategy kapseloi ajon aikana vaihdettavan algoritmin. Command kapseloi kokonaisen pyynnön parametreineen ja vastaanottajineen sekä mahdollistaa historian ja jonotuksen.
Command Springissä
Spring Batchin Tasklet ja Spring Integrationin MessageHandler ovat sovellustason Command-kuvioita. Kukin Tasklet kapseloi yhden erätyön vaiheen.
Pikatarkistus
Minkä lisämetodin Command lisää execute()-metodin lisäksi kumoamisen tukemiseksi?
Kertaus
Command kapseloi toiminnot olioiksi. Käyttäkää sitä kumoamis- ja uudelleentekopinoihin, tehtäväjonoihin, makrojen tallentamiseen ja auditointilokien kirjaamiseen. Yhdistäkää se kutsujaan, joka ylläpitää komentohistoriaa.
Opi Java tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 104
- Oppitunnit
- 374
Usein kysytyt kysymykset
Onko oppitunti ”Command-malli: toimintojen kapselointi” ilmainen?
Kyllä – oppitunnin ”Command-malli: toimintojen kapselointi” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Java Academy-kurssin, päivitä CoddyKit PROhon. Java Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Command-malli: toimintojen kapselointi”?
Paketoi pyynnöt Command-olioiksi kumoamisen, uudelleen tekemisen ja makrojen tallentamisen tukemiseksi. Harjoittelet Java Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Java Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Java Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.
Kuinka kauan ”Command-malli: toimintojen kapselointi”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Java Academy-oppitunnilla?
Kyllä. Jokainen Java Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Observer-malli: tapahtumailmoitukset
- Strategy-malli: vaihdettavat algoritmit
- Command-malli: toimintojen kapselointi
- Template Method: algoritmien rungot