Návrhový vzor příkazu

Photo of author

By etechblogcz

Co představuje vzor příkaz?

Vzor příkaz je designový model chování, jenž umožňuje parametrizaci akcí, které se týkají požadavků (příkazů), a jejich samotné spouštění, a to nezávisle na tom, kdo tyto akce vyvolává. Příkaz v sobě nese kompletní informace potřebné k uskutečnění dané akce, což usnadňuje jeho modifikaci a rozšiřování o nové příkazy.

V jakých situacích je vhodné použít vzor příkaz?

Vzor příkaz se doporučuje aplikovat v situacích, kdy:

  • Je nutné oddělit proces zadávání příkazu od jeho samotného provedení.
  • Je požadováno zaznamenávání historie příkazů s možností jejich opakování nebo vrácení.
  • Je potřeba dynamicky přidávat, odebírat nebo měnit příkazy.
  • Je žádoucí podpora makropříkazů a skriptů.

Klíčové komponenty vzoru příkaz

Abstraktní příkaz: Jedná se o rozhraní nebo abstraktní třídu, která definuje základní rozhraní pro všechny příkazy.
Konkrétní příkazy: Třídy, které implementují abstraktní rozhraní a představují specifické akce, které mají být provedeny.
Příjemce: Třída, která vykonává akce spojené s obdrženými příkazy.
Iniciátor: Třída, která volá a předává konkrétní příkazy příjemci.
Správce příkazů: Volitelná třída, která spravuje historii příkazů a umožňuje jejich opakování nebo vrácení.

Příklady využití

Zrušení finanční operace: V systému pro správu bankovních účtů lze vzor příkaz využít k reprezentaci finančních transakcí, jako je vklad nebo výběr. Každý typ transakce je reprezentován samostatným příkazem, který má přístup k datům účtu a provede požadovanou operaci. V případě chyby nebo zrušení transakce, lze pomocí správce příkazů vrátit stav účtu do původního stavu před provedením operace.

Zpracování dat: V systémech pro zpracování dat se vzor příkaz hodí k reprezentaci různých operací s daty, jako je filtrování, třídění nebo agregace. Každá operace je představována specifickým příkazem, který poskytuje příjemcům rozhraní API pro přístup a modifikaci dat.

Implementace vzoru příkaz

Ukázka v C#

// Rozhraní příkazu
public interface IPříkaz
{
void Proved();
void VratZpet();
}

public class VlozitTextPrikaz : IPříkaz
{
private Dokument _dokument;
private string _text;

public VlozitTextPrikaz(Dokument dokument, string text)
{
_dokument = dokument;
_text = text;
}

public void Proved()
{
_dokument.VlozitText(_text);
}

public void VratZpet()
{
_dokument.OdebratText(_text);
}
}

public class OdebratTextPrikaz : IPříkaz
{
private Dokument _dokument;
private string _text;

public OdebratTextPrikaz(Dokument dokument, string text)
{
_dokument = dokument;
_text = text;
}

public void Proved()
{
_dokument.OdebratText(_text);
}

public void VratZpet()
{
_dokument.VlozitText(_text);
}
}

// Příjemce
public class Dokument
{
private string _text = „“;

public void VlozitText(string text)
{
_text += text;
}

public void OdebratText(string text)
{
_text = _text.Replace(text, „“);
}
}

// Iniciátor
public class TextEditor
{
private List _historiePříkazů = new List();

public void Vlozit(string text)
{
var příkaz = new VlozitTextPrikaz(new Dokument(), text);
příkaz.Proved();
_historiePříkazů.Add(příkaz);
}

public void Odebrat(string text)
{
var příkaz = new OdebratTextPrikaz(new Dokument(), text);
příkaz.Proved();
_historiePříkazů.Add(příkaz);
}

public void VratPosledniPrikaz()
{
if (_historiePříkazů.Any())
{
var příkaz = _historiePříkazů.Last();
příkaz.VratZpet();
_historiePříkazů.Remove(příkaz);
}
}
}

Závěrečné shrnutí

Vzor příkaz je užitečným nástrojem pro oddělení způsobu zadávání příkazů od jejich provedení. Umožňuje snadnou modifikaci a rozšiřování o nové příkazy, evidenci historie příkazů a zajišťuje volné propojení mezi příkazy a příjemci. Jeho zavedení není složité a může přinést významné výhody v aplikacích, kde je flexibilita a opakovatelnost akcí klíčová.

Často kladené dotazy (FAQ)

1. Jaké jsou přínosy použití vzoru příkaz?

  • Oddělení zadávání příkazů od jejich realizace.
  • Snadná modifikace a přidávání nových příkazů.
  • Udržování historie příkazů pro opakování nebo vrácení.
  • Nezávislost mezi příkazy a příjemci.

2. Kde se vzor příkaz nejčastěji uplatní?

  • Zrušení transakcí.
  • Zpracování dat.
  • Správa historie uživatelských akcí.
  • Podpora makro příkazů a skriptů.

3. Jaké jsou hlavní stavební prvky vzoru příkaz?

  • Příkaz (abstraktní třída nebo rozhraní).
  • Konkrétní příkazy (implementace konkrétních operací).
  • Příjemce (provádí akce související s příkazy).
  • Iniciátor (vyvolává a odesílá příkazy).
  • Správce příkazů (volitelný, spravuje historii příkazů).

4. Jaký je rozdíl mezi příkazem a iniciátorem?

Příkaz obsahuje logiku a data potřebná k realizaci akce, zatímco iniciátor se stará o vyvolání příkazu a jeho předání příjemci.

5. Jaká je úloha správce příkazů?

Správce příkazů sleduje historii provedených příkazů a umožňuje jejich opakování nebo vrácení.

6. Může vzor příkaz zlepšit výkon aplikace?

Vzor příkaz může přispět ke zlepšení výkonu, pokud je třeba často opakovat stejné akce, protože umožňuje ukládat a opětovně spouštět příkazy namísto opakovaného provádění akcí.

7. Existují nějaké varianty nebo rozšíření vzoru příkaz?

Ano, existují varianty jako je příkaz s návratovou hodnotou, který umožňuje příkazům vracet hodnoty, a makro příkaz, který kombinuje více příkazů do jednoho složeného příkazu.

8. Jak mohu začlenit vzor příkaz do mé aplikace?

Implementujte rozhraní Příkaz pro definici abstraktního příkazu a vytvořte konkrétní příkazy pro specifické akce. Vytvořte příjemce, který bude provádět akce a iniciátora, který bude příkazy vyvolávat. Volitelně přidejte správce příkazů pro správu historie.