Command- og Iterator-mønstre
Indkapsl forespørgsler som objekter med Command, og gennemgå samlinger med Iterator.
Command- og Iterator-mønstre er en gratis Ren arkitektur og designmønstre i praksis-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Ren arkitektur og designmønstre i praksis, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Ren arkitektur og designmønstre i praksis-kurset indeholder 4 lektioner i alt.
Hvad er Command-mønsteret?
Command-mønsteret er et adfærdsmønster, der omdanner en anmodning til et selvstændigt objekt. Dette objekt indeholder alle oplysninger om anmodningen, herunder den metode, der skal kaldes, og de parametre, den har brug for.
Tænk på det som at lægge en instruktion i en pakke. Du kan derefter sende denne pakke rundt, sætte den i kø eller endda fortryde den senere, uden at afsenderen behøver at vide, hvordan instruktionen udføres.
Command-mønsterets kernekomponenter
For at forstå Command-mønsteret kan vi se på dets vigtigste aktører:
- Command: Et interface eller en abstrakt klasse, der erklærer en
execute()-metode. - ConcreteCommand: Implementerer
Command-interfacet og knytter et bestemt Receiver-objekt til en handling. - Receiver: Det objekt, der udfører det faktiske arbejde. Det ved, hvordan operationen skal udføres.
- Invoker: Beder kommandoen om at udføre sin anmodning. Den kender ikke detaljerne i operationen eller receiveren.
- Client: Opretter et
ConcreteCommand-objekt og angiver detsReceiver.
Command-mønsteret i praksis
Forestil dig et intelligent hjem-system, hvor du vil styre en lampe. Uden Command-mønsteret ville din fjernbetjening kalde light.turnOn() eller light.turnOff() direkte.
Med Command-mønsteret ved fjernbetjeningen kun, hvordan den skal "udføre en kommando". Den er ligeglad med, om den tænder en lampe, åbner en garageport eller afspiller musik. Det gør din fjernbetjening (Invoker) meget fleksibel!
Kode: Kommando til at tænde og slukke en lampe
Her er et enkelt Java-eksempel, der viser Command-mønsteret til styring af en lampe. Bemærk, hvordan RemoteControl (Invoker) kun interagerer med Command-interfacet.
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();
}
}Fordele ved Command-mønsteret
Command-mønsteret har flere effektive fordele:
- Afkobling: Invoker er afkoblet fra receiveren, hvilket reducerer afhængighederne.
- Fortryd og gentag: Kommandoer kan gemmes i en historikliste, så det bliver nemmere at implementere funktionalitet til at fortryde og gentage handlinger.
- Kø og logning: Anmodninger kan sættes i kø, logges og udføres på forskellige tidspunkter.
- Udvidelsesmuligheder: Nye kommandoer kan tilføjes uden at ændre den eksisterende Invoker-kode.
Hvad er Iterator-mønsteret?
Iterator-mønsteret er et adfærdsmønster, der giver en måde at tilgå elementerne i et samlingsobjekt (f.eks. en liste eller et array) sekventielt uden at afsløre dets underliggende repræsentation.
Forestil dig, at du har en afspilningsliste med sange. En iterator gør det muligt at gå gennem hver sang én ad gangen (næste, forrige osv.) uden at vide, om afspilningslisten er gemt som et array, en sammenkædet liste eller noget helt andet.
Iterator-mønsterets kernekomponenter
Iterator-mønsteret består af disse hovedkomponenter:
- Iterator: Et interface, der definerer metoder til at tilgå og gennemløbe elementer (f.eks.
hasNext(),next()). - ConcreteIterator: Implementerer
Iterator-interfacet og holder styr på den aktuelle position i gennemløbet. - Aggregate: Et interface eller en abstrakt klasse, der definerer en metode til at oprette et
Iterator-objekt (f.eks.createIterator()). - ConcreteAggregate: Implementerer
Aggregate-interfacet og returnerer en instans afConcreteIterator.
Iterator-mønsteret i praksis
De fleste programmeringssprog har indbyggede iteratorer (f.eks. Javas Iterator eller Pythons iterables). Men nogle gange opretter du en brugerdefineret samling, hvor du selv skal definere logikken for gennemløbet.
Hvis du f.eks. har en brugerdefineret klasse MyStringList, der internt gemmer strenge, kan en iterator lade ekstern kode gennemløbe disse strenge uden at vide, om MyStringList internt bruger et array, en sammenkædet liste eller en træstruktur.
Kode: Iterator til en brugerdefineret liste
Dette Java-eksempel viser, hvordan du opretter en brugerdefineret StringList og en Iterator til den. Main-metoden kan gennemløbe listen ved hjælp af iteratoren uden at kende dens interne array.
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());
}
}
}Hurtigt tjek: Designmønstre
Du har lært om to effektive adfærdsmønstre. Lad os teste din forståelse.
Opsummering: Command og Iterator
Godt klaret! I denne lektion udforskede vi to vigtige adfærdsmønstre:
- Command-mønsteret indkapsler en anmodning som et objekt, hvilket muliggør effektive funktioner som fortryd og gentag, køhåndtering og logning af anmodninger, samtidig med at Invoker afkobles fra receiveren.
- Iterator-mønsteret giver en standardiseret måde at gennemløbe elementer i en samling på. Det skjuler samlingens interne struktur og fremmer fleksible metoder til gennemløb.
Hvis du mestrer disse mønstre, forbedrer du i høj grad fleksibiliteten og vedligeholdelsesvenligheden i dine softwaredesigns.
Lær Ren arkitektur og designmønstre i praksis med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 12
- Lektioner
- 48
Ofte stillede spørgsmål
Er lektionen “Command- og Iterator-mønstre” gratis?
Ja — hele teksten til “Command- og Iterator-mønstre” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Ren arkitektur og designmønstre i praksis-kurset, skal du opgradere til CoddyKit PRO. Ren arkitektur og designmønstre i praksis-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Command- og Iterator-mønstre”?
Indkapsl forespørgsler som objekter med Command, og gennemgå samlinger med Iterator. Du øver dig i Ren arkitektur og designmønstre i praksis med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Ren arkitektur og designmønstre i praksis?
Der kræves ingen tidligere erfaring. Ren arkitektur og designmønstre i praksis på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.
Hvor lang tid tager lektionen “Command- og Iterator-mønstre”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Ren arkitektur og designmønstre i praksis-lektion?
Ja. Alle Ren arkitektur og designmønstre i praksis-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Observer- og Strategy-mønstre
- Command- og Iterator-mønstre
- Template Method- og State-mønstre
- Mediator og Chain of Responsibility