Ren arkitektur og designmønstre i praksis · Lektion

Command- og Iterator-mønstre

Indkapsl forespørgsler som objekter med Command, og gennemgå samlinger med Iterator.

Lektion 2 af 411 trin

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 dets Receiver.

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 af ConcreteIterator.

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.

Gratis at komme i gang

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

  1. Observer- og Strategy-mønstre
  2. Command- og Iterator-mønstre
  3. Template Method- og State-mønstre
  4. Mediator og Chain of Responsibility
← Tilbage til Ren arkitektur og designmønstre i praksis