Command- ja Iterator-mallit
Kapseloikaa pyynnöt olioiksi Command-mallilla ja käykää kokoelmia läpi Iterator-mallilla.
Command- ja Iterator-mallit on ilmainen Clean Architecture ja suunnittelumallit käytännössä-oppitunti CoddyKitissä. Tämä on oppitunti 2/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 Clean Architecture ja suunnittelumallit käytännössä-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Clean Architecture ja suunnittelumallit käytännössä-kurssilla on yhteensä 4 oppituntia.
Mikä on Command-malli?
Command-malli on käyttäytymissuunnittelumalli, joka muuttaa pyynnön itsenäiseksi objektiksi. Tämä objekti sisältää kaikki pyyntöön liittyvät tiedot, kuten kutsuttavan metodin ja sen tarvitsemat parametrit.
Voitte ajatella tätä niin, että ohje pakataan pakkaukseen. Tämän pakkauksen voi välittää eteenpäin, asettaa jonoon tai jopa kumota myöhemmin ilman, että lähettäjän tarvitsee tietää, miten ohje suoritetaan.
Command-mallin keskeiset osat
Command-mallin ymmärtämiseksi tarkastellaan sen keskeisiä toimijoita:
- Command: Rajapinta tai abstrakti luokka, joka määrittelee
execute()-metodin. - ConcreteCommand: Toteuttaa
Command-rajapinnan ja yhdistää tietyn Receiver-objektin toimintaan. - Receiver: Objekti, joka suorittaa varsinaisen työn. Se tietää, miten toiminto suoritetaan.
- Invoker: Pyytää komentoa suorittamaan pyyntönsä. Se ei tunne toiminnon tai vastaanottajan yksityiskohtia.
- Client: Luo
ConcreteCommand-objektin ja asettaa senReceiver-objektin.
Command-malli käytännössä
Kuvitellaan älykotijärjestelmä, jolla ohjataan valoa. Ilman Command-mallia kaukosäädin kutsuisi suoraan metodeja light.turnOn() tai light.turnOff().
Command-mallia käytettäessä kaukosäädin tietää vain, miten ”komento suoritetaan”. Sille ei ole väliä, sytytetäänkö valo, avataanko autotallin ovi vai käynnistetäänkö musiikki. Tämä tekee kaukosäätimestä eli Invokerista erittäin joustavan!
Koodi: valon sytytys- ja sammutuskomento
Tässä on yksinkertainen Java-esimerkki, joka havainnollistaa Command-mallia valon ohjaamiseen. Huomaa, kuinka RemoteControl eli Invoker käyttää vain Command-rajapintaa.
interface Command {
void execute();
}
class Light {
public void turnOn() {
System.out.println("Light is ON");
}
public void turnOff() {
System.out.println("Light is OFF");
}
}
class LightOnCommand implements Command {
private Light light;
public LightOnCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.turnOn();
}
}
class LightOffCommand implements Command {
private Light light;
public LightOffCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.turnOff();
}
}
class RemoteControl {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void pressButton() {
command.execute();
}
}
public class Main {
public static void main(String[] args) {
Light livingRoomLight = new Light();
LightOnCommand onCommand = new LightOnCommand(livingRoomLight);
LightOffCommand offCommand = new LightOffCommand(livingRoomLight);
RemoteControl remote = new RemoteControl();
remote.setCommand(onCommand);
remote.pressButton();
remote.setCommand(offCommand);
remote.pressButton();
}
}Command-mallin hyödyt
Command-malli tarjoaa useita merkittäviä etuja:
- Riippuvuuksien vähentäminen: Invoker ja Receiver eivät ole suoraan kytkettyjä toisiinsa, joten riippuvuuksia on vähemmän.
- Kumoa ja tee uudelleen: Komennot voidaan tallentaa historiaksi, mikä helpottaa kumoamis- ja uudelleentoimintojen toteuttamista.
- Jonotus ja lokitus: Pyyntöjä voidaan asettaa jonoon, kirjata lokiin ja suorittaa eri aikoina.
- Laajennettavuus: Uusien komentojen lisääminen ei edellytä olemassa olevan Invoker-koodin muuttamista.
Mikä on Iterator-malli?
Iterator-malli on käyttäytymissuunnittelumalli, joka tarjoaa tavan käsitellä koosteobjektin, kuten listan tai taulukon, alkioita järjestyksessä paljastamatta sen sisäistä rakennetta.
Kuvitelkaa soittolista, joka sisältää kappaleita. Iteraattorin avulla voitte käydä kappaleet läpi yksi kerrallaan (seuraava, edellinen ja niin edelleen) tarvitsematta tietää, tallennetaanko soittolista taulukkoon, linkitettyyn listaan vai johonkin aivan muuhun rakenteeseen.
Iterator-mallin keskeiset osat
Iterator-malli sisältää seuraavat pääosat:
- Iterator: Rajapinta, joka määrittelee metodit alkioiden käyttämiseen ja läpikäyntiin (esimerkiksi
hasNext()janext()). - ConcreteIterator: Toteuttaa
Iterator-rajapinnan ja pitää kirjaa läpikäynnin nykyisestä sijainnista. - Aggregate: Rajapinta tai abstrakti luokka, joka määrittelee metodin
Iterator-objektin luomiseen (esimerkiksicreateIterator()). - ConcreteAggregate: Toteuttaa
Aggregate-rajapinnan ja palauttaaConcreteIterator-instanssin.
Iterator-malli käytännössä
Useimmissa ohjelmointikielissä on valmiit iteraattorit, kuten Javan Iterator tai Pythonin iteroitavat objektit. Joskus kuitenkin rakennatte mukautetun kokoelman, jolle on määriteltävä oma läpikäyntilogiikka.
Jos esimerkiksi käytössänne on mukautettu MyStringList-luokka, joka tallentaa merkkijonoja sisäisesti, iteraattorin avulla ulkoinen koodi voi käydä merkkijonot läpi tietämättä, käyttääkö MyStringList sisäisesti taulukkoa, linkitettyä listaa vai puurakennetta.
Koodi: mukautettu listan iteraattori
Tämä Java-esimerkki näyttää, kuinka luodaan mukautettu StringList ja sille Iterator. Main-metodi voi käydä listan läpi iteraattorin avulla tietämättä sen sisäisestä taulukosta.
interface MyIterator {
boolean hasNext();
String next();
}
interface MyAggregate {
MyIterator createIterator();
}
class MyStringList implements MyAggregate {
private String[] items;
private int count;
public MyStringList(int capacity) {
items = new String[capacity];
count = 0;
}
public void add(String item) {
if (count < items.length) {
items[count++] = item;
}
}
@Override
public MyIterator createIterator() {
return new StringListIterator(this);
}
// Helper to access elements by index for the iterator
public String get(int index) {
if (index >= 0 && index < count) {
return items[index];
}
return null;
}
public int size() {
return count;
}
}
class StringListIterator implements MyIterator {
private MyStringList list;
private int position;
public StringListIterator(MyStringList list) {
this.list = list;
this.position = 0;
}
@Override
public boolean hasNext() {
return position < list.size();
}
@Override
public String next() {
if (hasNext()) {
return list.get(position++);
}
return null;
}
}
public class Main {
public static void main(String[] args) {
MyStringList names = new MyStringList(5);
names.add("Alice");
names.add("Bob");
names.add("Charlie");
MyIterator iterator = names.createIterator();
System.out.println("Iterating through names:");
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}Pikatarkistus: suunnittelumallit
Olette oppineet kahdesta tehokkaasta käyttäytymissuunnittelumallista. Testataan, miten hyvin ymmärsitte ne.
Kertaus: Command ja Iterator
Hienoa työtä! Tässä oppitunnissa tutustuimme kahteen keskeiseen käyttäytymissuunnittelumalliin:
- Command-malli kapseloi pyynnön objektiksi, mikä mahdollistaa tehokkaat toiminnot, kuten kumoamisen ja uudelleen tekemisen, pyyntöjen jonottamisen ja lokituksen. Samalla Invoker irrotetaan Receiveristä.
- Iterator-malli tarjoaa vakiomuotoisen tavan käydä kokoelman alkiot läpi. Se piilottaa kokoelman sisäisen rakenteen ja edistää joustavien läpikäyntimenetelmien käyttöä.
Näiden mallien hallitseminen parantaa merkittävästi ohjelmistosuunnitelmienne joustavuutta ja ylläpidettävyyttä.
Opi Clean Architecture ja suunnittelumallit käytännössä 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
- 12
- Oppitunnit
- 48
Usein kysytyt kysymykset
Onko oppitunti ”Command- ja Iterator-mallit” ilmainen?
Kyllä – oppitunnin ”Command- ja Iterator-mallit” 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 Clean Architecture ja suunnittelumallit käytännössä-kurssin, päivitä CoddyKit PROhon. Clean Architecture ja suunnittelumallit käytännössä-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Command- ja Iterator-mallit”?
Kapseloikaa pyynnöt olioiksi Command-mallilla ja käykää kokoelmia läpi Iterator-mallilla. Harjoittelet Clean Architecture ja suunnittelumallit käytännössä-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Clean Architecture ja suunnittelumallit käytännössä-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Clean Architecture ja suunnittelumallit käytännössä-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.
Kuinka kauan ”Command- ja Iterator-mallit”-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ä Clean Architecture ja suunnittelumallit käytännössä-oppitunnilla?
Kyllä. Jokainen Clean Architecture ja suunnittelumallit käytännössä-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- ja Strategy-mallit
- Command- ja Iterator-mallit
- Template Method- ja State-mallit
- Mediator ja Chain of Responsibility