Návrhový vzor příkazu
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
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.